与WPF MVVM应用程序中的继承的Master-Detail关系

时间:2014-09-16 11:05:09

标签: wpf mvvm

我认为这是一个相当基本的问题,但我还没有找到答案。

我有以下情况: 在不使用任何形式的EntityFrameWork的情况下,我有一个PersonViewModel和一个PersonDetailsViewModel,它继承自PersonViewModel。在我的PersonView中,我在网格中显示PersonViewModel的集合。我有像Name,DateOfBirth等属性作为列。当我双击一个人时,会弹出一个绑定到PersonDetailsViewModel的PersonDetailView。在此视图中,显示有关此人的其他信息(性别,社会安全号码等)。我允许的用户编辑所有属性。

现在我想知道最好/最常用的方法是确保PersonViewModel使用在PersonDetailsViewModel中编辑的值进行更新。

我可以想到几个选择。对于初学者,我可以选择不使用不同的ViewModel,而是使用PersonDetailViewModels在网格中显示,但是缺点是我需要为每个ViewModel检索大量不必要的数据。 我也可以在PersonDetailsView关闭后同步相应的属性。 我能想到的第三个选项是,不是从PersonView继承,而是在PersonDetailsView中包含PersonView类型的属性并公开它的属性并将其用于PersonDetailsView中的绑定。 PersonDetailsViewModel中的所有其他额外属性将在其构造函数中检索。

3 个答案:

答案 0 :(得分:1)

根据我的经验,更新共享相同数据的视图模型的最佳方法是使用Mediator模式发送数据已更新的通知消息。

  

为了拥有良好的面向对象设计,我们必须创建很多   类彼此交互的。如果有某些原则   没有应用最终框架将在每个完全混乱的地方结束   对象依赖于许多其他对象才能运行。为了避免   紧耦合框架,我们需要一个机制来促进   对象之间的交互以对象不知道的方式进行   其他物体的存在。

     

来源http://www.oodesign.com/mediator-pattern.html

在您的设计中,通知说明发生了什么(数据已更新)而不是应该发生什么(数据被重新加载),这对于您的设计在语法上很重要,因为该响应可能不会像系统演变一样保持不变。

通常,常见的MVVM库中包含Mediator实现。例如,Prism' EventAggregator

答案 1 :(得分:0)

实现您的要求的最简单方法是在PersonViewModel类中添加一个构造函数,该类带有PersonDetailsViewModel实例并更新其公共属性:

public PersonViewModel(PersonDetailsViewModel personDetailsViewModel)
{
    Name = personDetailsViewModel.Name;
    ...
    DateOfBirth = personDetailsViewModel.DateOfBirth;
}

...

PersonViewModel = new PersonViewModel(PersonDetailsViewModel);

当然,这不一定是在构造函数中...它可以很容易地成为PersonViewModel类中的方法,甚至是单独的Factory Pattern类中的辅助方法,它也可以给你。

答案 2 :(得分:0)

除了Sheridans的回答之外。我将Detail作为PersonDetailsViewModel类型的属性公开

public class PersonViewModel
{
    public PersonDetailsViewModel Detail {get;set;}
}

然后你的xaml看起来就像那样

<TextBlock Text="{Binding Detail.Gender}"/>

EDIT1:除上述评论外

我不会做任何继承(这就是user1087702在他的问题中写的)。我只想创建两个类:PersonVM和PersonVMDetail。如果请求是,为了显示来自我的person对象的详细信息,为什么我不应该只在PersonVMDetail类型的PersonVM类中创建一个公共属性 - 来满足此请求?