2

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

ComboData = new ObservableCollection<MyType>();

并向其中添加数据,例如

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

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

问题是当我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

4

2 回答 2

0

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

于 2012-05-23T09:42:10.937 回答
0

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

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

于 2012-05-23T09:42:43.250 回答