2012-01-27 406 views
3

我花了相当多的时间来研究这个问题。任何帮助将不胜感激。ComboBox双向绑定到selecteditem

我有一个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; 
    } 

按钮点击事件改变了这势必ComboBox的SelectedItem属性的MySelectedItem。但是在按钮点击时,组合框中没有任何东西被选中。我不明白为什么。即使我明确设置Mode = TwoWay,也会发生这种情况。请建议。请注意,我的datacontext设置为self,所以我已确认数据绑定正在通过添加复选框正确地发生。编辑:请注意,这发生在示例WPF项目中。但我想要这个工作的原始项目是一个winforms应用程序。我正在使用elementhost嵌入我的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

这是我提供的一个样本。编辑该问题以避免混淆。 – 2012-01-27 09:16:13

3

所选项目需要设置为您绑定到的列表中的某个对象。将它设置为具有匹配值的字符串将不起作用。所以,试试这个:

foreach(string animal in ListOfValues) 
{ 
    if(animal == "dog") 
     this.MySelectedItem = animal; 
} 
+0

感谢您的回答,但我确认这不是必需的,因为我的类型是“字符串”类型 – 2012-01-30 06:14:40

0

如果你的项目是引用类型(和你只是用一个例子字符串),检查equals()方法将返回你所期望的。你可能需要重写Equals方法(例如this.ID == other.ID或类似的东西)来获得正确的行为。