ComboBox双向绑定到选定项

3

我花了相当多的时间调查这个问题。非常感谢您的任何帮助。

我有一个像这样声明的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的值,该值与ComboBox的SelectedItem属性绑定。但是在单击按钮时,ComboBox中没有选定任何内容。我不明白为什么会这样。即使显式设置Mode=TwoWay也是如此。请给出建议。请注意,我的数据上下文设置为self,所以通过添加复选框,我确认数据绑定正在正确发生。
编辑:请注意,这种情况发生在WPF项目示例中。但是,在我想要实现此功能的原始WinForms应用程序中,我使用ElementHost嵌入了我的WPF控件。这是否有影响?
3个回答

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会成为组合框中的选定项目,复选框则切换其状态。


这只是我提供的一个示例。编辑了问题以避免任何混淆。 - Sudarshan chandan

3
选定的项目需要设置为绑定列表中的对象。将其设置为具有相匹配值的字符串将不起作用。因此,请尝试以下方法:
foreach(string animal in ListOfValues)
{
    if( animal == "dog")
      this.MySelectedItem = animal;
}

谢谢您的回答,但我已经验证过了,因为我的类型是“字符串”类型,所以这不是必需的。 - Sudarshan chandan

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接