C#学习教程:使用INotifyPropertyChanged更新ObservableCollection项属性我有一个ObservableCollection类。我正在调用Web服务并检索一组设备。然后我枚举ObservableCollection并将每个项目设置为从Web服务检索到的相应设备。我认为设备的属性值与ObservableCollection中的项目不同,但PropertyChanged事件未触发。我假设这是ByDesign,为了触发PropertyChanged事件,我真的必须枚举每个属性并设置值吗?例如,在以下情况中,没有任何Device类属性触发PropertyChanged事件。ObservableCollectionItems=newObservableCollection();项目=LoadItems();列出设备=GetDevices();foreach(variteminItems){varcurrentDevice=devices.Single(d1=>d1.ID==item.ID);项目=当前设备;但是如果我手动更新每个属性,我就在做生意:ObservableCollectionItems=newObservableCollection();项目=LoadItems();列出设备=GetDevices();foreach(variteminItems){varcurrentDevice=devices.Single(d1=>d1.ID==item.ID);item.Latitude=currentDevice.Latitude;item.Longitude=currentDevice.Longitude;在上面的例子中,纬度和经度都会触发它们的事件。由于我的类有很多属性,有没有比一个一个做更好的方法呢?为此,Load方法可能很有用,这样您就不会覆盖引用,而是设置旧对象的所有属性。这是我刚刚编写的一个通用扩展方法,它将分配所有可写属性,它非常粗糙:GetProperties()){if(property.CanWrite&&property.CanRead){if(!deep||property.PropertyType.IsPrimitive||property.PropertyType==typeof(String)){property.SetValue(target,property.GetValue(来源,空),空);}else{objecttargetPropertyReference=property.GetValue(target,null);targetPropertyReference.Load(targetPropertyReference.GetType(),property.GetValue(source,null),deep);然后你应该可以调用item.Load(item.GetType(),currentDevice,true);//false用于浅加载分配所有值(如果它们是属性)。编辑:使方法递归,因此它将为非原始或值类型(或字符串)的属性调用Load。在某些情况下可能仍然行为不端。您还可以向该方法添加一个bool并控制是否应该进行深度加载(如果可能)。(只需将||!deep添加到那个长if表达式)注意:您当然也可以覆盖对象引用并使用反射为所有不同的属性引发PropertyChanged事件(如果您愿意)。无论哪种方式,您都不需要手动处理每个属性。Edit2:因为PropertyInfo.GetValue返回一个对象,我以前的代码没有递归加载,不幸的是,你必须显式传递一个类型,请参阅旧版本的修订版。编辑3:有关在没有类型参考的情况下使这项工作正常进行的方法,请参阅我问的这个专门问题。但是,这并没有解决其他问题,例如循环引用和枚举对象的属性。在第一个示例中,设置集合中的项目将触发CollectionChanged事件,而不是单个项目的PropertyChanged事件。您可以通过为PropertyChanged事件指定一个空字符串来通知所有属性。例如:item.RaisePropertyChanged("");其中RaisePropertyChanged是调用INotifyPropertyChanged实现的PropertyChanged事件的公共方法。我认为您可以重载=运算符并在那里进行属性分配。然后将生成PropertyChanged事件,您仍将使用与第一个示例中相同的语法。Device类必须实现接口INotifyPropertyChanged。然后为每个属性照常触发通知属性更改事件。这将自动启用属性更改通知。以上就是C#学习教程:使用INotifyPropertyChanged更新ObservableCollection项的属性。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
