【问题标题】:MVVM / ViewModel / User controls / DataContext / Command - Design Issue/DiscussionMVVM / ViewModel / 用户控件 / DataContext / 命令 - 设计问题/讨论
【发布时间】:2011-06-04 19:35:47
【问题描述】:

我有一个用户控件,可以显示/管理实体(员工、企业等)的一个或多个地址。

我从各种视图中利用了这个用户控件 - 将地址的 UI 封装在控件中。

我有几个 ViewModel 从各种不同的角度保存/公开地址集合 - 每个通常由不同的 ViewModel 管理(每个 View 一个 ViewModel)

我已将适当的 DataContext 传递给用户控件,这意味着尽管我有各种公开地址集合的 ViewModel - 我可以通过 DC 绑定传递适当的上下文。

然后我的问题变成了我应该将用于添加和删除地址的命令逻辑放在哪里?我不想在每个视图模型中放置相同的命令,因为那只是重复代码。

作为 MVVM 的新手,我是否只需创建一个具有 IAddressCommand 接口的类 - 然后将每个 ViewModel 中的命令存根?我是否只是将一个视图模型封装在另一个视图模型中?

想法?

问候 理查德

【问题讨论】:

    标签: design-patterns mvvm mvvm-light


    【解决方案1】:

    如果每种地址类型的命令都相同,则考虑拥有一个基础 ViewModel,Address ViewModels 从该基础 ViewModel 继承。通用命令代码可以放在基类中。

    【讨论】:

    • 听起来不错,但我已经为所有 ViewModel 提供了一个基类,多重继承将不起作用!
    • @codputer 您可以引入一个继承自现有“ViewModelBase”的 AddressViewModel,然后将现有类更改为继承自该模型。
    • 这可行,但没有解决组件的 DataContext 设置在对象图的不同级别的问题,而不是直接关闭 ViewModel 设置的命令成员。如果我将 DataContext 向上移动对象图,则字段绑定必须引用树中更深的级别。
    • @codputer 在 MVVM 中,ViewModelDataContext
    【解决方案2】:

    如果您确定需要针对您的 ViewModels:View 采用 1:1 方法,请提供可以将这些组件绑定在一起的服务(不是 ViewModel)。然后,您将调用 ViewModel 中的服务,该服务将负责从基础集合中添加/删除地址。然后可以根据需要由多个 ViewModel 使用此服务。

    如果您愿意调整您的设计;使用单个 ViewModel 或将其缩减,这可以提供从底层集合添加/删除地址的能力,然后可以被多个 View 使用和使用。

    恕我直言,采用第一条路线并将此工作负载抽象为服务将是更好的方法;虽然任何一个都足够了。

    【讨论】:

    • 您建议我如何将命令按钮绑定到服务? DC 设置绑定的上下文,并且对象图中的命令按钮高于字段绑定。 ScottGu 在 FireStarted 中提到,在 Silverlight 5 中将有一个 Ancestor (?) 绑定子句来搜索绑定 DC 树的命令 - 我认为这种情况正是他们引入新子句的原因。
    • @codputer 像现在一样将命令绑定到 ViewModel,但在执行命令时,您将调用服务;不要尝试绑定到服务本身。
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多