C# 如何实现基于其他行计算行的DatagGrid视图模型

C# 如何实现基于其他行计算行的DatagGrid视图模型,c#,wpf,mvvm,datagrid,mvvm-light,C#,Wpf,Mvvm,Datagrid,Mvvm Light,我正在开发一个基于WPF DataGrid控件和MVVM设计模式的金融应用程序。在这个应用程序中,我需要DataGrid显示基于其他行计算的行。下图中,单价、数量、服务费和税费是数据行。用户可以像往常一样通过就地编辑来编辑这些行的值。但其他行(计算行)是只读的,并根据给定的数据行和自定义表达式的值动态计算。例如,“Total”的自定义表达式类似于[Unite Price]*[Quantity]。用户将能够使用自己的自定义表达式添加新的计算行 我对表达式引擎有一个比较清晰的概念。但我正在考虑在这

我正在开发一个基于WPF DataGrid控件和MVVM设计模式的金融应用程序。在这个应用程序中,我需要DataGrid显示基于其他行计算的行。下图中,单价、数量、服务费和税费是数据行。用户可以像往常一样通过就地编辑来编辑这些行的值。但其他行(计算行)是只读的,并根据给定的数据行和自定义表达式的值动态计算。例如,“Total”的自定义表达式类似于[Unite Price]*[Quantity]。用户将能够使用自己的自定义表达式添加新的计算行

我对表达式引擎有一个比较清晰的概念。但我正在考虑在这种情况下应该如何实现视图模型。特别是,当用户更改数据行中的某个先前值时,视图模型应该足够智能,可以在不刷新整个DataGrid的情况下更新计算值。目前,我已将数据行和计算行放在同一个可观察集合中。但真正的问题是视图模型如何在必要时促进数据行和计算行之间的通信,以使计算值保持最新


任何关于此问题的好建议、建议或类似实现的源代码链接都将非常感谢

您可以为记录创建基类或接口,并实现两个版本:数据保持器和数据摘要。 模型是一个简单的类,实现了
INotifyPropertyChanged
。ModelSummary派生自模型并具有计算属性。它还必须侦听模型PropertyChange事件。为了简单起见,我正在覆盖虚拟属性:

public class ModelSummary : Model
{
    private IEnumerable<Model> models;
    public ModelSummary(IEnumerable<Model> models)
    {
        this.models = models;
        foreach (Model model in models)
        {
            model.PropertyChanged += (s, e) => OnPropertyChanged(e.PropertyName);
        }
    }

    public override int Value1
    {
        get
        {
            return models.Sum(m => m.Value1);
        }
    }
}
公共类模型摘要:模型
{
私有可数模型;
公共模型摘要(IEnumerable模型)
{
这个。模型=模型;
foreach(模型中的模型)
{
model.PropertyChanged+=(s,e)=>OnPropertyChanged(e.PropertyName);
}
}
公共覆盖int值1
{
得到
{
回报模型。总和(m=>m.Value1);
}
}
}
ViewModel中的用法:

var list = new List<Model>
{
    new Model {Value1 = 1, Description = "A"},
    new Model {Value1 = 1, Description = "B"}
};

Values = new ObservableCollection<Model>(list)
{
     new ModelSummary(list) { Description = "Summary" }
};
var list=新列表
{
新模型{Value1=1,Description=“A”},
新模型{Value1=1,Description=“B”}
};
值=新的ObservableCollection(列表)
{
新模型摘要(列表){Description=“Summary”}
};

我还没有考虑添加新记录的可能性。

谢谢您抽出时间。。是的,如何添加新记录是一个问题。您的问题并没有涉及新记录。您可以根据
CollectionChanged
事件
models.CollectionChanged+=(发送方,参数)=>OnPropertyChanged(“值1”)将
list
更改为可观察的集合,并更新
ModelSummary