DataGrid: 数据项更新并保持多选
DataGrid绑定的后台数据源,对于数据源更新的情况,如,某些数据的某些字段需要更新,若直接列改旧数据源A为新的数据源的源B,显示的数据没有问题,但有一个问题就是界面的原先的选择项,多选或单选,便不会保持,针对需要保持多选项的情况,有以下两种方案:
1 筛选出需要更新的项,并不移除,只需要挨个对其所有属性赋值即可,多选项可以保持,但问题是需要对额外添加Merge类,即如何对两个对象进行赋值;
2 使用一个中间类:
如 ObservableCollection<T>需要更改为ObservableCollection<EntityWrap<T>>,而EntityWrap的定义简单如下:
public class EntityWrap<T>:INotifyPropertyChanged { public EntityWrap(T entity) { _entity = entity; } private T _entity; public T Entity { get { return _entity; } set { _entity = value; RaiseChanged("Entity"); } } public event PropertyChangedEventHandler PropertyChanged; private void RaiseChanged(string Name) { if (null != PropertyChanged) PropertyChanged(this, new PropertyChangedEventArgs(Name)); } }
UI上绑定需要修改为 {Entity.Pro}这样。这样对于需要更新的entity直接赋值为新的对象即可,而不会改变UI上绑定对象的引用,即不会丢失多选状态。
方案1 对于实体类型简单的情况下,比较方便,但当属性太多时,不得不采用反射赋值的方式,而反射的性能+可以需要更新的数据项较多时,性能可能难以忍受。方案2使用额外的对象来保持UI上的多选操作,性能高,相应的内存占用也稍高。