【问题标题】:MVVM/WPF: Using a ObservableCollection<T> as a list in a domain model, is that good/bad?MVVM/WPF:使用 ObservableCollection<T> 作为域模型中的列表,是好还是坏?
【发布时间】:2011-02-22 11:40:22
【问题描述】:

我已经聚合了诸如 Customer:Order:Product 之类的模型。

由于我的视图绑定到具有 ObservableCollection 类型的属性客户的 BillingViewModel

并且此集合中的一位客户有一个订单“列表” 命名为 ObservableCollection

并且此集合中的一个订单有一个产品“列表” 命名为 ObservableCollection

我需要 ObservableCollection 来进行数据绑定,但是域模型真的应该有 ObservableCollection 吗?通常它有一个

列表或 IEnumerable !

这是坏习惯还是有副作用?

我对上面的正确之处进行了解释:

class Customer
{
   int CustomerID {get;set;}
   ObservableCollection<Order> { get;set;}
}

class BillingViewModel
{
  ObservableCollection<Customer> _customers;

public BillingViewModel()
{

  Customers= GetAggregatedCustomersOrdersProductsFromRepository();

}

public ObservableCollection<Customer> Customers
{
   get{ return _customers;}
   set
{
  _customers = value;
  this.RaisePropertyChanged("Customers");

}
}

}

我希望现在更清楚了!我的 ViewModel 和 Model 中有 ObservableCollection!

【问题讨论】:

    标签: mvvm model viewmodel observablecollection generic-list


    【解决方案1】:

    从我读过的示例看来,一种做法是在到达客户端时将您的域模型 Customer:Order:Product 重新排列为 MainViewModel:CustomerViewModel:OrderViewModel:ProductViewModel。这将允许您将任何虚拟机标记为脏并仅在需要时保存。它还允许您将视图组合成许多视图,每个视图都由它们自己的 VM 驱动,因此如果稍后您决定将视图从一个大屏幕更改为多个模态,那将是相当无缝的。 MainViewModel 的原因更像是一个控制器而不是一个 ViewModel,它的职责是获取域模型并将其分解为虚拟机,也可能是您的视图如何显示(分组或模态)的控制器,它还可以包含诸如 SaveAllDirty 之类的命令。

    【讨论】:

    • 我不需要那些“脏”的东西。当用户输入数据后按下命令时,我的数据被保存。 “...并将其重新排列为 MainViewModel:CustomerViewModel:OrderViewModel:ProductViewModel...”这是我之前做过的及其总开销...
    【解决方案2】:

    这取决于这些属性是否需要内置的更改通知。如果你有某种逻辑依赖于在改变状态时做某事,那很好。如果它只是为了支持数据绑定而该类本身不是 ViewModel,那么我认为这是一种不好的形式。

    【讨论】:

    • 没有逻辑。我只是在视图中添加一个订单,在我的 BillingViewModel 中将 CurrentOrder 添加到 SelectedCustomer 中,例如 SelectedCustomer.Orders.Add(CurrentOrder);然后我的带有订单的 DataGrid 会立即更新。使用 List 视图中没有更新:/ 那么对于您所说的错误表单我该怎么办...?
    • 如果您的 BillingViewModel 使用的是 ObservableCollection,那么没有什么问题。只有当你的对象不与视图交互时,它才是错误的形式。
    • 为什么不好? :) 在哪里写域集合必须是 List 或 IEnumerable ??
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2014-12-21
    • 1970-01-01
    • 2012-05-04
    • 2021-06-05
    • 2016-08-28
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多