我在WPF应用程序中有一个数据网格,它绑定到像这样的ObservableCollection
<DataGrid ItemsSource="{Binding Spring.SpringData, Mode=OneWay}" />
我的数据显示正常,我可以编辑网格中的数据,但是当我手动编辑网格中的数据时,它不会触发PublishSpringChange事件。基础数据发生了变化,但事件没有触发,我缺少什么?
使用具有以下
的Spring模型public class Spring : INotifyPropertyChanged
{
private ObservableCollection<SpringData> _SpringData;
public ObservableCollection<SpringData> SpringData
{
get { return _SpringData; }
}
public Spring()
{
....
_SpringData = new ObservableCollection<SpringData>();
SpringData.CollectionChanged += PublishSpringChange;
...
}
private void PublishSpringChange(object sender, NotifyCollectionChangedEventArgs e)
{
// Code that does not run!
}
}
使用SpringData类
public class SpringData: BindableBase
{
private double _force;
private double _displacement;
public SpringData(double displacement, double force)
{
Displacement = displacement;
Force = force;
}
public double Displacement
{
get { return _displacement; }
set { SetProperty(ref _displacement, value); }
}
public double Force
{
get { return _force; }
set { SetProperty(ref _force, value); }
}
}
答案 0 :(得分:4)
INotifyCollectionChanged
仅在您实际修改集合时触发。这是在集合中添加,删除,移动,替换或重置项目时。当SpringData
对象中的一个属性发生更改时,它不会触发。
为了侦听SpringData对象的更改,假设它实现了INotifyPropertyChanged
,您需要将侦听器连接到每个项目的PropertyChanged
事件。
答案 1 :(得分:3)
有时为所有属性更改单个处理程序非常有用。这是你如何做到的。
处理CollectionChanged如上:
_SpringData = new ObservableCollection<SpringData>();
SpringData.CollectionChanged += PublishSpringChange;
现在,对于集合中所有添加和删除的对象,都要向PropertyChanged添加一个处理程序:
private void PublishSpringChange(object sender, NotifyCollectionChangedEventArgs e)
{
foreach (INotifyPropertyChanged added in e.NewItems)
{
added.PropertyChanged += SpringDataOnPropertyChanged;
}
foreach (INotifyPropertyChanged removed in e.OldItems)
{
removed.PropertyChanged -= SpringDataOnPropertyChanged;
}
}
private SpringDataOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
//your code here
}