我正在尝试将 a 绑定ComboBox
到 anObservableCollection<MyType>
但它没有按我预期的那样工作。当我创建一个实例时ComboData
,例如
ComboData = new ObservableCollection<MyType>();
并向其中添加数据,例如
ComboData.Add(new MyType(string.Format("{0}", i.ToString()), i));
我可以看到正在设置的Value
属性和事件处理程序执行。这是正确的功能。MyType
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
?