当我更改ComboBox的选定项目时如何触发INotifyPropertyChanged处理程序?

时间:2012-05-23 09:30:43

标签: c# wpf xaml combobox inotifypropertychanged

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

ComboData = new ObservableCollection<MyType>();

并向其添加数据,例如

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

我可以看到Value的{​​{1}}属性正在设置,MyType事件处理程序正在执行。这是正确的功能。

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

我有什么问题吗?

_value定义为:

MyType

用户控件的XAML是:

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!!!
    }

}

用户控件背后的代码是

<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; } } 中的所选项目时,我需要做什么才能触发事件处理程序?

2 个答案:

答案 0 :(得分:0)

最好使用具有CurrentChanged事件的CollectionView类。您可以将CollectionView绑定到ComboBox。因此,当selectitem更改时...您可以从CurrentChangedEvent中的CollectionViewMember.CurrentItem获取值

答案 1 :(得分:0)

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

ComboBox有一个SelectedItemChanged事件,该事件将在选择新项目时触发。