查找Observable Collection中更改的项目

时间:2016-01-13 08:40:29

标签: c# wpf entity-framework wpfdatagrid observablecollection

我有一个来自EF db上下文的类,我在基于ObservableCollection的数据网格中显示了它。用户可以编辑网格,这一切都可以正常显示。

但是我现在需要将数据发送回数据库。我不想将集合中的所有项目发送到我的保存方法,因此我是否只能找到集合中已更改的项目?

2 个答案:

答案 0 :(得分:1)

只是一个想法(我不认为这是一个理想的解决方案),我遇到了类似的问题,四处寻找潜在的解决方案,但这些都不是我想要的。

我不得不将集合传递给WPF DataGrid,并且似乎抱怨使用List,因此我转向了ObservableCollection

由于多种原因,我不想直接与EF上下文合作,主要是因为我想获取项目并将其传递给要处理的中间交易工厂(业务逻辑)。

因此决定坚持使用ObservableCollection,而对ViewModel进行一些修改,因为我可以自由地这样做。

我的模型最终看起来像这样:

internal class databaseItemModel
{
    int _id; 
    string _description;
    decimal _price; 
    decimal _quantity;
    decimal _cost;
    bool _modified;

    public databaseItemModel()
    {
        _modified = false;
    }

    public int id { get { return _id; } }
    public bool modified { get { return _modified; } }
    public string description { get { return _description; } set { _description = value; _modified = true; } }
    public decimal price { get { return _price; } set { _price = value; _modified = true; } }
    public decimal quantity { get { return _quantity; } set { _quantity = value; _modified = true; } }
    public decimal cost { get { return _cost; } set { _cost = value; _modified = true; } }
    public bool selected { get; set; }

    public void setId(int _idvalue) 
    {
        _id = _idvalue;
    }
    public decimal value
    {
        get { return price * quantity; }
    }
    public void setDescription(string _descr)
    {
        _description = _descr; 
    }
    public void setPrice(decimal _pr)
    {
        _price = _pr;
    }
    public void setQuantity(decimal _qty)
    {
        _quantity = _qty;
    }
    public void setCost(decimal _cst) 
    {
        _cost = _cst;
    }
}

基本上,它背后的主要思想是,我将使用函数来填充数据,而不是直接使用属性,然后将该项目传递给ObservableCollection,后者随后将成为DataGrid.ItemsSource的源

因为DataGrid / ObservableCollection将与属性一起使用-修改过的对象将被标记为已修改,然后我将能够在退出时提取集合并收集修改过的项。

希望这会有所帮助。

答案 1 :(得分:0)

您可以使用NotifyCollectionChangedAction检测ObservableCollection

中已更改的项目

然而,只有Jens说,最好的方法是让EF为你处理它。

干杯。

ObservableCollection<int> listOfObject = new ObservableCollection<int>() { 1, 2, 3, 4};

listOfObject.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
    delegate (object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
    if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
            Console.WriteLine($"{e.NewItems[0]} just been added to the list at index = {e.NewStartingIndex}");
        }
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Replace)
        {
            Console.WriteLine($"Replace item {e.OldItems[0]} with {e.NewItems[0]}");
        }
    }
);

listOfObject.Add(1);
listOfObject[2] = 3;
listOfObject[3] = 1;

输出:

  

1刚被添加到index = 4

的列表中      

用3

替换第3项      

将项目4替换为1