2012-03-22 10 views
2

私は、ユーザーが異なる項目を選択できるように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プロパティがリストの最初の項目に設定されるようになりました。

解決方法はありますか?

答えて

1

チェックは私の周りの仕事を考え出したが、それは私が何を望むかかなりではありません。

SelectedValueの代わりにSelectedItemを使用するようにバインディングを変更しましたが、この問題は発生しません。

私はこのquestionからアイデアを得ました。

だから私はへ

SelectedValue="{Binding SelectedValue}" 

を変更(と私のViewModelのプロパティに改名):

SelectedItem="{Binding SelectedItem}" 

のViewModelに、このプロパティの使用を更新した後で、すべてが働きました。

1

私があなたの問題を正しく理解していれば、ここでいくつかのことが起こっています。

まず、Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}をあなたのバインディングに設定していません。

第2に、プロパティーバインディングは値自体に変更がある場合にのみ更新されます。このうちData Binding

+0

お返事ありがとうございます。残念ながら、ComboBox.SelectedValueは、[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue.aspx)に従ってデフォルトで 'TwoWay'をバインドします。 – davisoa

関連する問題