WPF MVVM DataGrid绑定后界面更改数据如何在ViewModel中得到更改事件?

大地主刘发财 2019-07-29 04:00:13
刚刚接触MVVM框架,好多地方都搞不懂,看书看得也是一脸懵逼,在这请教个问题
DataGrid绑定ObservableCollection,增加、删除新行的时候是有事件的,但修改现有行数据时是没有通知的,怎样才能在数据被修改的时候得到通知(事件)?

Model

public class DataModel : INotifyPropertyChanged
{
private int _id;
public int Id
{
get { return _id; }
set
{
_id = value;
OnPropChanged("Id");
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropChanged("Name");
}
}
private decimal _qty;
public decimal Qty
{
get { return _qty; }
set
{
_qty = value;
OnPropChanged("Qty");
}
}
private decimal _price;
public decimal Price
{
get { return _price; }
set
{
_price = value;
OnPropChanged("Price");
}
}
private decimal _amount;
public decimal Amount {
get { return _amount; }
set
{
_amount = value;
OnPropChanged("Amount");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}


ViewModel

private ObservableCollection<DataModel> _dataList = new ObservableCollection<DataModel>();
public ObservableCollection<DataModel> DataList
{
get { return _dataList; }
set { SetProperty(ref _dataList, value); }
}
public MainWindowViewModel()
{
DataList.Add(new DataModel
{
Id = 1,
Name = "杯",
Qty=5,
Price=20,
Amount=100
});
DataList.Add(new DataModel
{
Id=2,
Name="纸",
Qty=100,
Price=30,
Amount=3000
});
}


View

<DataGrid x:Name="dgv" ItemsSource="{Binding DataList}" Margin="57,40,446,247"/>

如图,当在界面上修改“数量”时,要自动计算金额,在MVVM这种模式下要如何实现?
...全文
417 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
大地主刘发财 2019-07-29
  • 打赏
  • 举报
回复
明白了 非常感谢
E次奥 2019-07-29
  • 打赏
  • 举报
回复
Amount 这个属性可以直接在定义的时候就用 数量和 单价计算 赋值
github_36000833 2019-07-29
  • 打赏
  • 举报
回复
DataModel实现了INotifyPropertyChanged接口,你可以通过订阅每一个DataModel的PropertyChanged事件来得到比如金额的变化通知。

public MainWindowViewModel()
{
    DataList.CollectionChanged += (sender, e) =>
    {
        if (e.OldItems != null)
        {
            foreach (var item in e.OldItems?.OfType<DataModel>()) item.PropertyChanged -= DataModel_PropertyChanged;
        }
        if (e.NewItems != null)
        {
            foreach (var item in e.NewItems?.OfType<DataModel>()) item.PropertyChanged += DataModel_PropertyChanged;
        }
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
        {
            ShowTotal();
        }
    };

    DataList.Add(new DataModel
    {
        Id = 1,
        Name = "杯",
        Qty = 5,
        Price = 20,
        Amount = 100
    });
    DataList.Add(new DataModel
    {
        Id = 2,
        Name = "纸",
        Qty = 100,
        Price = 30,
        Amount = 3000
    });
}

private void DataModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case nameof(DataModel.Amount):
            ShowTotal();
            break;
    }
}

// ShowTotal示例而已,不是MVVM模式。
private void ShowTotal()
{
    System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(
        System.Windows.Threading.DispatcherPriority.Normal,
        (Action)delegate 
        {
            var grandTotal = DataList.Sum(x => x.Amount);
            MessageBox.Show("总金额:" + grandTotal);
        });
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧