c# - 在主从 View 中聚合详细信息值

标签 c# wpf mvvm master-detail

我在一些自定义实体中有主从关系。假设我有以下结构:

class Master : INotifyPropertyChanged
{
    public int Id { get; set; } // + property changed implementation 
    public string Name { get; set; } // + property changed implementation

    public ObservableCollection<Detail> Details { get; }
}

class Detail : INotifyPropertyChanged
{
     public int Id { get; private set; }
     public string Description { get; set; }
     public double Value { get; set; } // + property changed implementation
}

我的目标是拥有一个 ListView,使用 GridView,显示主对象列表。当我选择一个特定的 Master 时,我将有一个单独的 ListView 用于详细信息,允许编辑。基本上,一个相当标准的主从 View 。

但是,我还希望 Master 的 GridView 显示该 master 的所有 Detail 元素的总和,即:Details.Select(d => d.Value).Sum();

这很容易使用自定义 IValueConverter 来显示。我可以从详细信息集合直接转换为双重显示总和,并通过 IValueConverter 将 TextBlock 的文本绑定(bind)到 Details OneWay。这将起作用,并在我打开窗口时显示正确的值。

但是,如果我更改其中一个详细信息成员,这将不会更新(即使详细信息实现了 INotifyPropertyChanged),因为集合本身仍然相同(ObservableCollection 引用未更改)。

我想在主列表中有一个聚合值,在详细列表中显示总和(或平均值/计数/等),并在用户详细更改属性时使其保持最新。我该如何着手实现它?


编辑:

理想情况下,如果有一种方法可以在不涉及直接更改 Master 类的情况下完成此操作,我会更愿意。有问题的应用程序正在使用 MVVM 模式,我真的不希望为了实现特定的 View 而更改我的模型类。有没有一种方法可以在不将自定义逻辑引入模型的情况下做到这一点?

最佳答案

我正在考虑使用 UI 的可能性,您可以在其中显式绑定(bind)并从命令执行绑定(bind)/更新……但看起来最简单的方法是扩展 ObservableCollection 以添加/删除监听器添加/删除每个 Detail 实例,然后在其中任何一个更改时触发 CollectionChanged 。称之为DeeplyObservableCollection

class Master : INotifyPropertyChanged
{
    public int Id { get; set; } // + property changed implementation 
    public string Name { get; set; } // + property changed implementation
    public double Sum {get {return Details.Sum(x=>x.Value);}}

    public DeeplyObservableCollection<Detail> Details { get; }

    // hooked up in the constructor
    void OnDOCChanged(object sender, CollectionChangedEventArgs e) 
    { OnPropertyChanged("Sum"); }
}

如果你不能正确地覆盖你需要的所有方法,最坏的情况是你必须用另一种类型包装一个 ObservableCollection...

关于c# - 在主从 View 中聚合详细信息值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1568387/

相关文章:

wpf - Caliburn Micro,从 MV 集中聚焦

silverlight-4.0 - Silverlight在“页面刷新”上丢失身份验证

c# - 将模型的另一个实例分配给 ViewModel

c# - 使用依赖注入(inject)访问 DbContext

c# - 使用套接字从服务器向客户端发送值

c# - 从 Excel 中检索 "row pairs"

c# - ASP.NET MySQL 未定义参数

c# - DataGrid 列宽不会自动更新

c# - 有没有办法在 WPF TextBlock 中给一个字符加下划线?

c# - 文件解析器在 MVVM 设计模式中属于什么位置?