しばらくの間 WPF を使用していましたが、助けが必要です。
以下のComboBox
ようなものがあります:
<TabControl>
<TabItem Header="1">
<ComboBox ItemsSource="{Binding MyList}" SelectedItem="{Binding MyListSelection}"/>
</TabItem>
<TabItem Header="2"/>
</TabControl>
タブ1から離れてから戻ってくると、選択が削除されます。その理由は、コントロールが範囲外に出てから戻ったときに破棄されるためだと思います。しかし、その過程で SelectedItem が null になり、これは実際にはユーザーが望んでいたものではなく、UI によるイベントです。ライフサイクル。
では、どのルートを選ぶのがベストなのだろうか?私は MVVM でこのアプリを構築しているので、ViewModel の MyListSelection プロパティの set 呼び出しを無視できますが、あちこちに ComboBox があり、WPF のバグと見なされるもののために ViewModel を変更するのは好きではありません。
WPF ComboBox をサブクラス化できますが、SelectedItemChanging イベントがなく、SelectedItem が変更されたときにのみハンドラーを追加できます。
何か案は?
アップデート:
さて、壁に頭をぶつけた後、問題が再現されなかった理由がわかりました。リスト項目の型が何らかの理由でクラスの場合、SelectedItem は WPF によって null に設定されますが、値の型の場合は設定されません。
これが私のテストクラスです(VMBaseはINotifyPropertyChangedを実装する単なる抽象クラスです):
public class TestListViewModel : VMBase
{
public TestListViewModel()
{
TestList = new List<TestViewModel>();
for (int i = 0; i < 10; i++)
{
TestList.Add(new TestViewModel(i.ToString()));
}
}
public List<TestViewModel> TestList { get; set; }
TestViewModel _SelectedTest;
public TestViewModel SelectedTest
{
get { return _SelectedTest; }
set
{
_SelectedTest = value;
OnPropertyChanged("SelectedTest");
}
}
}
public class TestViewModel : VMBase
{
public string Name {get;set;}
}
したがって、TestList を int 型に変更してタブ間を行き来しても、SelectedItem は同じままです。ただし、タイプTestViewModel
SelectedTest の場合、タブ項目がフォーカスから外れると null に設定されます。
どうしたの?