私の 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>