WPF ComboBox SelectedItem が TabControl スイッチで Null に設定される 質問する

WPF ComboBox SelectedItem が TabControl スイッチで Null に設定される 質問する

私の WPF アプリケーションには、頭を悩ませている単純な問題があります。TabControl があり、すべての TabItem は、次のような DataTemplate を使用して ViewModel 用に生成された View です。

<DataTemplate DataType="{x:Type vm:FooViewModel}">
    <vw:FooView/>
</DataTemplate>

FooView には ComboBox が含まれています。

<ComboBox ItemsSource="{Binding Path=BarList}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedBar}"/>

FooViewModel には単純なプロパティが含まれていますpublic Bar SelectedBar { get; set; }。問題は、ComboBox の値を設定し、別のタブに変更してから元に戻すと、ComboBox が再び空になることです。プロパティのセッターにブレークポイントを設定すると、null別のタブに切り替えたときにプロパティが割り当てられていることがわかります。

私の理解では、タブが切り替えられると、VisualTree から削除されますが、ViewModel のプロパティが に設定されているのはなぜですかnull? これにより、永続的な状態を保持することが非常に困難になり、チェックすることはvalue != null適切な解決策ではないようです。この状況について、誰か意見を述べてもらえませんか?

編集: セッター ブレークポイントの呼び出しスタックには [外部コード] のみが表示され、ヒントは表示されません。

ベストアンサー1

私たちも同じ問題に遭遇しました。この問題について説明しているブログ記事を見つけました。どうやらそれはバグWPF では回避策があります:

SelectedItemバインディングを指定する前にバインディングItemsSourceと問題はなくなるはずです。

ブログ記事

TLDR;

変化:

<ComboBox ItemsSource="{Binding Countries, Mode=OneWay}"
          SelectedItem="{Binding SelectedCountry}"        
          DisplayMemberPath="Name" >
</ComboBox>

に:

<ComboBox SelectedItem="{Binding SelectedCountry}"
          ItemsSource="{Binding Countries, Mode=OneWay}"
          DisplayMemberPath="Name" >
</ComboBox>

おすすめ記事