WPF/MVVM=>;将域集合聚合为可观察集合
假设我急切地用NHibernate、EF或任何您想要的ORM工具加载一些业务集合 现在我有了一个IList,每个客户都有很多订单,每个订单都有很多产品 在CustomerRepository中有一个GetAllCustomer()方法 您在哪里以及如何将所有数据聚合为三个类型的可观察集合 客户、订单和产品,因为我需要添加/删除通知事件 在执行customerRepo.GetAllCustomer()的BillingViewModel中是否确实执行了类似的操作:WPF/MVVM=>;将域集合聚合为可观察集合,wpf,mvvm,dns,aggregate,Wpf,Mvvm,Dns,Aggregate,假设我急切地用NHibernate、EF或任何您想要的ORM工具加载一些业务集合 现在我有了一个IList,每个客户都有很多订单,每个订单都有很多产品 在CustomerRepository中有一个GetAllCustomer()方法 您在哪里以及如何将所有数据聚合为三个类型的可观察集合 客户、订单和产品,因为我需要添加/删除通知事件 在执行customerRepo.GetAllCustomer()的BillingViewModel中是否确实执行了类似的操作: BillingViewModel.
BillingViewModel.cs
私有ObservableCollection_customersOC=新ObservableCollection();
公共计费视图模型()
{
var customers=customerRepo.GetAllCustomer();
ConvertDomainToUICollections(客户);
}
私有ConvertDomainToUICollections(IList客户)
{
foreach(客户中的客户c)
{
_客户订单添加(c);
foreach(c.订单中的订单o)
{
//在这里,我不知道如何继续,并把每一个在另一个OC等。。。
}
}
}
就我个人而言,我只会在需要时,尽可能以“最低级别”聚合这样的数据
例如,在BillingViewModel中,我会为客户进行这样的聚合。但是,我不会在这里处理订单,而是在CustomerServiceWModel中处理,因为我会尝试设置它,以便编辑特定客户的订单
如果您需要在非常高的级别上执行此操作,您将有效地重写整个模型。这是可以做到的,但它确实降低了数据的有用性和可维护性,因为您在非常高的级别上有效地维护了模型的两个完整版本
也就是说,许多orm会为您更好地处理这一问题。例如,(我的最爱之一)只是让他们的集合直接从ORM自动实现
INotifyCollectionChanged
。这使得无需转换为ObservableCollection
——您只需使用从ORM返回的数据即可 一个选项是创建表示域模型中所有三种类型的类(基本上是viewmodels)。因此,您将创建一个customerVM类,它将有一个orderVM的成员可观察集合,orderVM将有一个ProductVM的成员可观察集合。然后将域模型映射到viewModels,这是数据的UI表示形式
有些人觉得为域和viewmodel创建单独的类很痛苦,并且必须在它们之间来回映射。然而,我认为这只是使用数据绑定和MVVM的现实。一个选项可能是为域对象生成代理或包装器,另一个选项可能是在域对象本身上具有通知接口
链接到相关问题:
编辑:我刚刚意识到链接的问题也是你的问题。:) 您可能对的BookLibrary示例应用程序感兴趣。它是一个使用实体框架的WPF MVVM应用程序。它通过引入EntityObservableCollection准确地解决了您的问题。是的,我知道该工具及其功能。似乎是一个伟大的产品,如果提供。和伟大的,我现在再次检查他们的主页,他们在免费版的变化。以前它被限制在8张桌子上。现在它仅限于8个用粗体字母书写的型号。我以前没有决定使用LS的原因是,我有许多N:M表超过了以前的8表规则,但现在所有的表都非常适合8个模型,感谢Reed在这里的回答间接地解决了我的问题:P hm。。。似乎一个N:MSQL关系(3个表)并没有像它看起来那样映射到两个Lightspeed模型,因为它需要这个作为另一个模型的through对象。。。我是对的吗?是的,我是=>然后什么都没有改变1个模型=1个表…是的,实际上我知道如何进行聚合以及在哪里等。。。使用纯SQL。。。但是使用ORM工具,我不得不为上面提到的每个域模型创建一个视图模型。。。我只是想再听听专业人士的意见;-)但我看到那些家伙只是使用专业工具:P
BillingViewModel.cs
private ObservableCollection<Customer> _customersOC = new ObservableCollection<Customer>();
public BillingViewModel()
{
var customers = customerRepo.GetAllCustomer();
ConvertDomainToUICollections(customers);
}
private ConvertDomainToUICollections(IList<Customer> customers)
{
foreach(Customer c in customers)
{
_customersOC.Add(c);
foreach(Order o in c.Orders)
{
// Here I do not know how to proceed and put each in another OC<Order> etc...
}
}
}