这是我试图做的..我想在数据网格中提供产品的编辑。首先,我将一个ObservableCollection包装成List<Product>
并为每个POCO实现了INotifyPropertyChanged接口。撤消更改并跟踪已更改以便提交似乎很难并且我遇到了很多问题。此外,我觉得在属性更改时为每个poco创建这么多事件处理程序并不是很奇怪...
所以我问DataTable是否解决了这些问题?即使它解决了验证的问题?它对POCO一无所知....还有其他更好的解决方案吗?
答案 0 :(得分:1)
属性更改处理程序并没有那么糟糕。这是一个例子:
// Hook up a CollectionChanged event
ProductCollection.CollectionChanged += ProductCollection_Changed;
// In the Collection Changed event, hook up a PropertyChanged event
void ProductCollection_Changed(object sender, CollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach(Product item in e.NewItems)
item.PropertyChanged += Product.PropertyChanged;
}
if (e.OldItems != null)
{
foreach(Product item in e.OldItems)
item.PropertyChanged -= Product.PropertyChanged;
}
}
// In the Product property changed event, do something.
// Usually I only use this for raising the CollectionChanged event when
// a property of an object inside a collection changes.
void Product_Changed(object sender, PropertyChangedEventArgs e)
{
}
就个人而言,我希望每个Product
跟踪它自己的更改,而不是在ViewModel中跟踪它们。首次创建产品时,请保留原始数据的副本,并提供类似UndoChanges()
方法的内容,只需重新加载原始数据。
要跟踪各个属性的更改,我会在每个set
属性的Product
方法中执行此操作。这是因为PropertyChanged
事件可以手动引发,并不一定意味着该属性已更改。
private int _someValue;
public int SomeValue
{
get { return _someValue; }
set
{
if (value != _someValue)
{
// Track what's changed here.
// How you do it is based on what you want to track
if (!ChangedProperties.Keys.Contains("SomeValue"))
{
ChangedProperties.Add(
new KeyValuePair<string, object>("SomeValue", _someValue));
}
_someValue = value;
RaisePropertyChanged("SomeValue");
}
}
}
答案 1 :(得分:1)
DataTable确实解决了一些问题......
DataView
进行排序和过滤,数据表可以查询,产生更快的结果。说完了......
INotifypropertyChanged
。Bindings
进行验证很容易实现。所以最终是你的选择。但是我不介意可观察的集合和INotifyPropertyChanged通知,因为它们似乎从WPF DataGrid中获得了最佳效果......样式和性能明智。