私は、ユーザーが異なる項目を選択できるようにTreeViewを持っています。各項目の表示は、DataTypeを適切なViewModelタイプに設定したデータテンプレートを使用して決定されます。 DataContextは、ツリービューの選択された項目に基づいて適切なViewModelに自動的に設定されます。 DataTemplatesのデータテンプレートのデータコンテキストを変更すると、コンボボックスの選択が解除されます
つの項目のリストおよび/取得のViewModelにSelectedValueのを設定するためのプロパティを取得するためのObservableCollectionにバインドされたコンボボックスがあります。
は、ここで問題です。
このタイプのアイテムを1つ選択し、同じタイプの別のアイテムを選択すると、正しい選択アイテムの代わりに空白が表示されます。コンボボックスは、新しいアイテムへの移行直後に、SelectedValueプロパティをNULLに設定してから、更新しないように見えます。
<ComboBox Margin="1,0"
ItemsSource="{Binding ItemsToSelect}"
SelectedValue="{Binding SelectedValue}"
SelectedValuePath="ValuePath" DisplayMemberPath="DisplayPath"
IsEnabled="{Binding CanSelectItem}">
</ComboBox>
本当に変わった部分は、同じタイプのアイテムを選択するときに異なるタイプのアイテムを選択すると、常に正しく表示されます。
SelectedValueセッターで NULLの値を無視しようとしましたが、これはPropertyChangedイベントを発生させたかどうかに関係なく機能しませんでした。
private MyObject selectedValue;
public MyObject SelectedValue
{
get
{
return selectedValue;
}
set
{
if (value != null)
{
this.selectedValue = value;
}
this.OnPropertyChanged("SelectedValue");
}
}
これは私がまだ見つかっていなかった興味深い属性に私を導く書き込み中に同様の質問を見て - このquestionからIsSynchronizedWithCurrentItem
。最初は、これで問題は解決したと思っていましたが、ちょっとした振る舞いに変わってしまいました。
この属性がTrue
に設定されている場合、コンボはではありません。選択範囲をクリアする代わりに、最初の項目を選択済みとしてマークします。そのため、NULLに設定する代わりに、SelectedValueプロパティがリストの最初の項目に設定されるようになりました。
解決方法はありますか?
お返事ありがとうございます。残念ながら、ComboBox.SelectedValueは、[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue.aspx)に従ってデフォルトで 'TwoWay'をバインドします。 – davisoa