检查以确保我的假设是正确的。
我有一个 ObservableCollection 类。我正在调用 Web 服务并检索一系列设备。然后,我枚举 ObservableCollection 并将每个项目设置为从 Web 服务检索到的相应设备。我检索的设备具有与 ObservableCollection 中的项目不同的属性值,但 PropertyChanged 事件未触发。
我假设这是 ByDesign,为了触发 PropertyChanged 事件,我实际上必须枚举每个属性并设置值?
例如,在下面的情况下,任何 Device 类属性都不会触发 PropertyChanged 事件。
ObservableCollection<Device> Items = new ObservableCollection<Device>();
Items = LoadItems();
List<Device> devices = GetDevices();
foreach (var item in Items)
{
var currentDevice = devices.Single(d1 => d1.ID == item.ID);
item = currentDevice;
}
但是,如果我手动更新每个属性,我就可以进行业务:
ObservableCollection<Device> Items = new ObservableCollection<Device>();
Items = LoadItems();
List<Device> devices = GetDevices();
foreach (var item in Items)
{
var currentDevice = devices.Single(d1 => d1.ID == item.ID);
item.Latitude = currentDevice.Latitude;
item.Longitude= currentDevice.Longitude;
}
在上面的例子中,Latitude 和 Longitude 都会触发它们的事件。
由于我的类有很多属性,有没有比逐个属性更好的方法呢?
在第一个示例中,设置集合中的项目将触发 CollectionChanged 事件,而不是单个项目的 PropertyChanged 事件。
您可以通过向 PropertyChanged 事件指定空字符串来通知所有属性。例如:
item.RaisePropertyChanged("");
where 提高财产变化是调用 INotifyPropertyChanged 实现的 PropertyChanged 事件的公共方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)