【问题标题】:displaying supplementary info about collection item in MVVM在 MVVM 中显示有关集合项的补充信息
【发布时间】:2011-10-17 06:51:28
【问题描述】:

对 WPF 和 MVVM 不熟悉,并试图了解正常的做事方式。

假设我有一个可观察的客户对象集合。我可以将 ListView 或 ItemsControl 绑定到此,它们都可以正常显示。

现在假设我有一些关于未存储在客户对象中的每个项目的补充信息。假设可能推出了特别优惠,并且某些客户有资格获得该优惠,但此标志未保存在客户对象中。

在列表中显示此补充信息的标准方式是什么?

我的直接想法是在我的视图模型中创建一个新的结构集合,其中包含一个客户对象和这个标志。然后我可以将列表直接绑定到这个集合,并将各种显示组件绑定到适当的结构成员。

但是,当我已经有一个 ObservableCollection 客户时,这似乎有点浪费。如果我希望新列表处于“实时”状态,那么我需要新集合订阅并对基础客户集合中的添加/删除做出反应。

这是这样做的方法吗?或者有什么方法可以让我以某种方式单独维护优惠标志,但仍然在我的 ListView 中绑定到它们?

非常感谢

【问题讨论】:

    标签: wpf mvvm observablecollection


    【解决方案1】:

    当使用 MVVM 模式时,ViewModel 是“您的视图的模型”,即它是一个与您当前的视图非常相似的模型。

    我明白为什么您可能希望您的底层模型分别存储优惠和客户。

    伪代码:

    class MyModel
    {
       List<Offer> Offers {get; set;}
       List<Customer> Customers {get; set;}
    }
    

    但是,您不能将 ListView 绑定到您的客户并以某种方式将他们与您的报价相关联。您的 ViewModel 的角色是塑造模型,以便更容易将其绑定到您的视图:

    class CustomerViewModel
    {
        // the customer model
        private Customer customer;
    
        // and offer - might be null
        private Offer offer;
    
        // expose properties of the two above model objects here
    } 
    

    您的视图模型将使用模型Customer 实例的集合创建这些CustomerViewModel 实例中的ObservableCollection,如果存在Offer,则定位它。

    这个ObservableCollection&lt;CustomerViewModel&gt; 可以很容易地绑定到您的视图。

    【讨论】:

    • 啊,好吧,和我当时猜的差不多。我想我只是太习惯 WPF 为我做所有事情了!看起来我可能不得不实际编写一些代码。再次感谢。
    猜你喜欢
    • 2014-08-29
    • 2014-12-17
    • 2016-02-27
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2017-05-30
    相关资源
    最近更新 更多