WPF中的Datagrid和sql datatable vs其他方法

时间:2011-10-14 13:22:30

标签: wpf datagrid

这是我试图做的..我想在数据网格中提供产品的编辑。首先,我将一个ObservableCollection包装成List<Product>并为每个POCO实现了INotifyPropertyChanged接口。撤消更改并跟踪已更改以便提交似乎很难并且我遇到了很多问题。此外,我觉得在属性更改时为每个poco创建这么多事件处理程序并不是很奇怪...
所以我问DataTable是否解决了这些问题?即使它解决了验证的问题?它对POCO一无所知....还有其他更好的解决方案吗?

2 个答案:

答案 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确实解决了一些问题......

  1. 如果您不确定要有多少列。
  2. 当频繁编辑时,编辑会发生在数据表上,如果数据表有约束,那么它们将因无效条目而出错。因此,保持了一定程度的验证和数据完整性。
  3. 通过使用DefaultView(DataView进行排序和过滤,数据表可以查询,产生更快的结果。
  4. 说完了......

    1. 通过可观察的集合可以更好地实现频繁更新,每个项目都已实施INotifypropertyChanged
    2. 使用Bindings进行验证很容易实现。
    3. Datagrid确实为集合的对象模型提供了比数据表更多的功能。
    4. 所以最终是你的选择。但是我不介意可观察的集合和INotifyPropertyChanged通知,因为它们似乎从WPF DataGrid中获得了最佳效果......样式和性能明智。