使用MVVM从DataGridView保存更改的最佳方法

本文关键字:最佳 方法 保存更改 DataGridView MVVM 使用 | 更新日期: 2023-09-27 18:02:24

我有DataGridView,它在我的视图模型中绑定到ObservableCollection。收集物品实现INotifypropertyChanged。条目从EF加载一些字段,从web请求加载一些字段。

用户可以编辑DataGridView中的部分字段。当用户编辑单元格时,我如何保存数据库中项目的更改(没有任何"提交"按钮)?

当填写列表时,我可以订阅列表PropertyChanged事件中的每个项目。这是一个好方法吗?

在事件处理程序中:

    private void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        var item = (TradeItemViewModel) sender;
        if (e.PropertyName == "CountLimint" || e.PropertyName == "PriceLimit")
        {
            var repository = new ItemsRepository();
            var dto_item = repository.GetById(item.ClassId, item.IntanceId);
            dto_item.CountLimit = item.CountLimint;
            dto_item.PriceLimit = item.PriceLimit;
            repository.Update(dto_item);
        }
    }

使用MVVM从DataGridView保存更改的最佳方法

为集合项创建ViewModel类,并在setter中更新数据库。

public class TradeItemDatabaseViewModel
{
    private readonly TradeItem _Model;
    public int CountLimit
    {
        get { return _Model.CountLimit; }
        set(int value) 
        {
            if(Equals(_Model.CountLimit, value) == true) return;
            this.SaveCountLimit(value);
            _Model.CountLimit = value;
            this.RaisePropertyChanged(nameOf(this.CountLimit));
        }           
    }
    private void SaveCountLimit(int value)
    {
        var repository = new ItemsRepository();
        var dto_item = repository.GetById(item.ClassId, item.IntanceId);
        dto_item.CountLimit = item.CountLimint;
        repository.Update(dto_item);
    }
}

然后将ObservableCollection<TradeItemdatabaseViewModel>绑定到DataGridView.DataSource

以上是基于你的问题的原始示例。