如何触发 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));
我可以看到正在设置 MyType
的 Value
属性并执行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
中的选定项时,我需要做什么来触发事件处理程序?
在组合框中选择其他选项不会更改 ComboData 中的任何项目,它只是更改所选项目,因此它不会使用 MyType 中的资源库。 它使用 getter 检索要显示的值。
组合框有一个 SelectedItemChanged 事件,该事件将在选择新项时触发。
最好使用CollectionView
类,它有一个CurrentChanged事件。您可以将 CollectionView 绑定到您的组合框。所以当选定项更改时..您可以从 CurrentChangedEvent 中的 CollectionViewMember.CurrentItem 中获取值