ComboBox双向绑定到selecteditem

时间:2012-01-27 08:54:40

标签: wpf 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;
    }

按钮单击事件会更改MySelectedItem,该MySelectedItem绑定到组合框的SelectedItem属性。但是在按钮上单击组合框中没有选择任何内容。我不明白为什么。即使我明确设置Mode = TwoWay,也会发生这种情况。请建议。请注意,我的datacontext设置为self,因此我已通过添加复选框确认数据绑定正确发生

编辑:请注意,这发生在示例WPF项目中。但我希望这个工作的原始项目是一个winforms应用程序。我正在使用elementhost来嵌入我的wpf控件。这有什么不同吗?

3 个答案:

答案 0 :(得分: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;
}

完美适合我。当我单击按钮时,dog会在组合框中显示所选项目,并且复选框会切换其状态。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

如果您的项目是引用类型(并且您只是使用字符串作为示例),请检查Equals()方法是否返回您期望的内容。您可能需要覆盖Equals方法(例如this.ID == other.ID或类似的东西)以获得正确的行为。