【问题标题】:ComboBox two way binding to selecteditemComboBox 两种方式绑定到选定项
【发布时间】:2012-01-27 08:54:39
【问题描述】:

我已经花费了大量时间来调查这个问题。任何帮助将不胜感激。

我有一个这样声明的 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 设置为 self,因此我通过添加复选框确认数据绑定正确发生

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

【问题讨论】:

    标签: wpf combobox


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,但我确认这不是必需的,因为我的类型是“字符串”类型
    【解决方案2】:

    我试图重现您的问题,但我有一些问题。你能告诉我你对 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 成为组合框中的选定项目,并且复选框切换其状态。

    【讨论】:

    • 这是我提供的样本。编辑问题以避免任何混淆。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多