我认为这是一个相当基本的问题,但我还没有找到答案。
我有以下情况: 在不使用任何形式的EntityFrameWork的情况下,我有一个PersonViewModel和一个PersonDetailsViewModel,它继承自PersonViewModel。在我的PersonView中,我在网格中显示PersonViewModel的集合。我有像Name,DateOfBirth等属性作为列。当我双击一个人时,会弹出一个绑定到PersonDetailsViewModel的PersonDetailView。在此视图中,显示有关此人的其他信息(性别,社会安全号码等)。我允许的用户编辑所有属性。
现在我想知道最好/最常用的方法是确保PersonViewModel使用在PersonDetailsViewModel中编辑的值进行更新。
我可以想到几个选择。对于初学者,我可以选择不使用不同的ViewModel,而是使用PersonDetailViewModels在网格中显示,但是缺点是我需要为每个ViewModel检索大量不必要的数据。 我也可以在PersonDetailsView关闭后同步相应的属性。 我能想到的第三个选项是,不是从PersonView继承,而是在PersonDetailsView中包含PersonView类型的属性并公开它的属性并将其用于PersonDetailsView中的绑定。 PersonDetailsViewModel中的所有其他额外属性将在其构造函数中检索。
答案 0 :(得分:1)
根据我的经验,更新共享相同数据的视图模型的最佳方法是使用Mediator模式发送数据已更新的通知消息。
为了拥有良好的面向对象设计,我们必须创建很多 类彼此交互的。如果有某些原则 没有应用最终框架将在每个完全混乱的地方结束 对象依赖于许多其他对象才能运行。为了避免 紧耦合框架,我们需要一个机制来促进 对象之间的交互以对象不知道的方式进行 其他物体的存在。
在您的设计中,通知说明发生了什么(数据已更新)而不是应该发生什么(数据被重新加载),这对于您的设计在语法上很重要,因为该响应可能不会像系统演变一样保持不变。
通常,常见的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)
public class PersonViewModel
{
public PersonDetailsViewModel Detail {get;set;}
}
然后你的xaml看起来就像那样
<TextBlock Text="{Binding Detail.Gender}"/>
EDIT1:除上述评论外
我不会做任何继承(这就是user1087702在他的问题中写的)。我只想创建两个类:PersonVM和PersonVMDetail。如果请求是,为了显示来自我的person对象的详细信息,为什么我不应该只在PersonVMDetail类型的PersonVM类中创建一个公共属性 - 来满足此请求?