【问题标题】:Aggregate detail values in Master-Detail view在主-详细信息视图中聚合详细信息值
【发布时间】:2010-12-06 19:19:42
【问题描述】:

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

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 对象的列表。当我选择一个特定的 Master 时,我将有一个单独的 ListView 用于详细信息,允许进行编辑。基本上,一个相当标准的主从视图。

但是,我还希望主控的 GridView 显示该主控的所有详细信息元素的总和,即:Details.Select(d =&gt; d.Value).Sum();

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

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

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


编辑:

理想情况下,我希望有一种不涉及直接更改 Master 类的方法来完成此任务。有问题的应用程序使用 MVVM 模式,我真的不希望更改我的模型类来实现特定的视图。有没有办法在不将自定义逻辑引入模型的情况下做到这一点?

【问题讨论】:

    标签: c# wpf mvvm master-detail


    【解决方案1】:

    我正在考虑使用 UI 进行显式绑定并从命令执行绑定/更新的可能性...但似乎最简单的方法是扩展 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 包装在另一种类型中......

    【讨论】:

    • +1,因为这确实有效。我曾经想过这个,但我真的很想在不改变大师班的情况下,在一个理想的世界里做到这一点。实现这意味着更改模型以允许视图工作,我只是不喜欢...
    • 嗯,不是真的...这与首先编写 ObservableCollection 没有太大区别。
    • 除了现在我的实体有一个“Sum”属性,这纯粹是一个视图问题,与实体无关......
    • 我不同意这种观点。 ViewModel 的目的是为 View 准备数据并执行计算。视图应该弄清楚如何显示数据,而不是弄清楚如何生成数据进行显示。
    • Will:ViewModel 应该解决这个问题,而不是 Model。我的措辞很糟糕 - 我的问题是这会影响我的模型中的项目,而不是我的 ViewModel 中的项目。
    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多