如何触发 INotifyProperty更改处理程序当我更改组合框的选定项

本文关键字:组合 INotifyProperty 何触发 处理 程序 | 更新日期: 2023-09-27 18:35:07

我正在尝试将ComboBox绑定到ObservableCollection<MyType>但它没有像我预期的那样工作。当我创建ComboData的实例时,例如

ComboData = new ObservableCollection<MyType>();

并向其中添加数据,例如

ComboData.Add(new MyType(string.Format("{0}", i.ToString()), i));

我可以看到正在设置 MyTypeValue 属性并执行PropertyChangedEventHandler事件处理程序。这是正确的功能。

问题是当我稍后在ComboBox中选择其他项目时。我希望看到再次设置Value并触发事件处理程序,但没有任何反应。但是,我可以看到该物业的getter正在被解雇并返回_value

我做错了什么吗?

MyType定义为:

public class MyType : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public MyType(string key, int value)
    {
        Key = key;
        Value = value;
    }
    public string Key { get; set; }
    private int _value;
    public int Value
    {
        get { return _value; }
        set
        {
            if (_value != value)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
    internal void OnPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
    private void IntegerItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // this never executes *after* the ComboBox has been populated!!!
    }
}

用户控件的 XAML 为:

<Grid>
    <ComboBox x:Name="cboItems"
      DisplayMemberPath="Key"
      SelectedValuePath="Value"
      ItemsSource="{Binding Path=ComboData}">
    </ComboBox>
</Grid>

用户控件的隐藏代码是

public partial class ComboBoxControl : UserControl
{
    public ObservableCollection<MyType> ComboData { get; set; }
    public ComboBoxControl()
    {
        InitializeComponent();
        ComboData = new ObservableCollection<MyType>();
        int min = 0;
        int max = 10;
        for (int i = min; i <= max; i++)
        {
            ComboData.Add(new MyType(string.Format("{0}", i.ToString()), i));
        }
        cboItems.DataContext = this;            
    }
}

当我更改ComboBox中的选定项时,我需要做什么来触发事件处理程序?

如何触发 INotifyProperty更改处理程序当我更改组合框的选定项

在组合框中选择其他选项不会更改 ComboData 中的任何项目,它只是更改所选项目,因此它不会使用 MyType 中的资源库。 它使用 getter 检索要显示的值。

组合框有一个 SelectedItemChanged 事件,该事件将在选择新项时触发。

最好使用CollectionView类,它有一个CurrentChanged事件。您可以将 CollectionView 绑定到您的组合框。所以当选定项更改时..您可以从 CurrentChangedEvent 中的 CollectionViewMember.CurrentItem 中获取值