Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF/MVVM=>;将域集合聚合为可观察集合_Wpf_Mvvm_Dns_Aggregate - Fatal编程技术网

WPF/MVVM=>;将域集合聚合为可观察集合

WPF/MVVM=>;将域集合聚合为可观察集合,wpf,mvvm,dns,aggregate,Wpf,Mvvm,Dns,Aggregate,假设我急切地用NHibernate、EF或任何您想要的ORM工具加载一些业务集合 现在我有了一个IList,每个客户都有很多订单,每个订单都有很多产品 在CustomerRepository中有一个GetAllCustomer()方法 您在哪里以及如何将所有数据聚合为三个类型的可观察集合 客户、订单和产品,因为我需要添加/删除通知事件 在执行customerRepo.GetAllCustomer()的BillingViewModel中是否确实执行了类似的操作: BillingViewModel.

假设我急切地用NHibernate、EF或任何您想要的ORM工具加载一些业务集合

现在我有了一个IList,每个客户都有很多订单,每个订单都有很多产品

在CustomerRepository中有一个GetAllCustomer()方法

您在哪里以及如何将所有数据聚合为三个类型的可观察集合

客户、订单和产品,因为我需要添加/删除通知事件

在执行customerRepo.GetAllCustomer()的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...
        }

    }
}