2012-01-27 15 views
3

私はこの問題を調査するのにかなりの時間を費やしました。どんな助けでも大歓迎です。ComboBox選択項目への双方向バインディング

私はこのように宣言されたWPF ComboBoxを持っています。後ろの私のコードでは

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition/> 
    <RowDefinition/> 
    <RowDefinition/> 
</Grid.RowDefinitions> 
    <Button Click="Button_Click">Click Me</Button> 
    <ComboBox ItemsSource="{Binding ListOfValues}" SelectedItem="{Binding MySelectedItem}" Grid.Row="1"> 
    </ComboBox> 
    <CheckBox IsChecked="{Binding IsValueChecked}" Grid.Row="2"></CheckBox> 
</Grid> 

、私はこれらの性質を持っていると私はINotifyPropertyChangedの

public Window1() 
    { 
     InitializeComponent(); 
     ListOfValues = new List<string>(); 
     ListOfValues.Add("apple"); 
     ListOfValues.Add("ball"); 
     ListOfValues.Add("cat"); 
     ListOfValues.Add("dog"); 
     MySelectedItem = "cat"; 
     IsValueChecked = true; 
    } 

    public List<string> ListOfValues 
    { 
     get 
     { 
      return _listOfValues; 
     } 
     set 
     { 
      _listOfValues = value; 
      OnPropertyChanged("ListOfValues"); 
     } 
    } 

    public string MySelectedItem 
    { 
     get 
     { 
      return _selectedValueString; 
     } 
     set 
     { 
      _selectedValueString = value; 
      OnPropertyChanged("MySelectedItem"); 
     } 
    } 

    public bool IsValueChecked 
    { 
     get 
     { 
      return _isVlaueChanged; 
     } 
     set 
     { 
      _isVlaueChanged = value; 
      OnPropertyChanged("IsValueChecked"); 
     } 
    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MySelectedItem = "dog"; 
     IsValueChecked = !IsValueChecked; 
    } 

を実装しています、ボタンのクリックイベントは、コンボボックスのSelectedItemプロパティにバインドされているMySelectedItemを変更します。しかし、ボタンをクリックすると、コンボボックスで何も選択されません。なぜか分からない。これは明示的にMode = TwoWayを設定しても起こります。提案してください。私のdatacontextは自己に設定されているので、チェックボックスを追加することでデータバインディングが正しく行われていることを確認しました。

EDIT:これはサンプルWPFプロジェクトで発生します。しかし、私はこれが動作したい私の元のプロジェクトは、winformsアプリです。私は、wpfコントロールを埋め込むために、要素ホストを使用しています。それは違いがありますか?

答えて

3

問題を再現しようとしましたが、いくつか質問があります。 OnPropertyChangedの実装を教えてください。 MSDN(http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onpropertychanged.aspx)を見ると、この関数は文字列ではなく最初のパラメータとしてDependencyPropertyChangedEventArgsを必要とします。また、OnPropertyChangedは、通常のプロパティではなく、依存関係のプロパティの変更について通知するためのものです。 INotifyPropertyChangedをサポートするためにそのメソッドをオーバーロードしたと思います。

public partial class TestWindow2 : Window, INotifyPropertyChanged 
{ 
    public TestWindow2() 
    { 
     InitializeComponent(); 

     ListOfValues = new List<string> { "apple", "ball", "cat", "dog" }; 
     MySelectedItem = "cat"; 
     IsValueChecked = true; 

     this.DataContext = this; 
    } 

    ... 

    public string MySelectedItem 
    { 
     get 
     { 
      return _selectedValueString; 
     } 
     set 
     { 
      _selectedValueString = value; 
      RaisePropertyChanged("MySelectedItem"); 
     } 
    } 

    ... 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MySelectedItem = "dog"; 
     IsValueChecked = !IsValueChecked; 
    } 

    private void RaisePropertyChanged(String name) 
    { 
     if(this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
私のために完璧に動作し

私が働い例を実装しようとした、これが結果です。ボタンをクリックすると、犬はコンボボックスで選択された項目になり、チェックボックスはその状態をトグルします。

+0

私が提供していたサンプルでした。混乱を避けるために質問を編集しました。 –

3

選択した項目は、バインドしたリストのオブジェクトに設定する必要があります。値が一致する文字列に設定しても機能しません。

+0

お返事ありがとうございますが、私のタイプは "文字列"タイプなのでこれは必須ではないことを確認しました –

0

アイテムが参照型であり(例として文字列を使用しているだけの場合)、Equals()メソッドが期待どおりの結果を返すかどうかを確認してください。正しい振る舞いを得るには、Equalsメソッド(たとえばthis.ID == other.IDなど)をオーバーライドする必要があります。

関連する問題