代码之家  ›  专栏  ›  技术社区  ›  Martin Moser

MVVM/命令和控制模板

  •  3
  • Martin Moser  · 技术社区  · 15 年前

    我目前正在使用MVVM/Commands和ControlTemplates。 我想做的很简单。我希望有一个列表,例如人员,用户可以在其中触发对每个人的操作。

    到目前为止,我所做的是创建一个VM,它公开PersonVM的列表,每个VM都包含我的person对象。然后,我创建了一个带有controltemplate的CustomControl,其中包括一个显示我的人员的ItemsControl。

    所有数据都显示得很好,一点问题也没有。

    然后我尝试添加允许用户从列表中删除一个人的部分。 所以我在datatemplate中添加了一个按钮。还是没问题。

    下一步是公开由按钮触发的命令。

    第一种方法是使用Josh Smith的RelayCommand。因此,我将其中一个添加到PersonViewModel并将其绑定到按钮。 它可以工作,但问题是我需要(在执行命令之后)引发父vm必须处理的事件。我觉得这不好,因为越来越多的命令使代码看起来很混乱。

    因此,我修改了所有内容以使用RoutedCommand,并尝试在控制层次结构的更高级别上添加CommandBinding。但这是不可能的,因为ControlTemplate不允许我调用viewmodel上的方法。

    所以我想知道解决这个问题的正确方法是什么?不知何故,我相信我走错了方向,但我不知道在哪里。

    短暂性脑缺血发作

    2 回复  |  直到 15 年前
        1
  •  2
  •   JerKimball    15 年前

    如果可能有点混乱,我已经做了一些工作,就是使用RelativeSource绑定来遍历DataContext(或命令绑定)备份逻辑树,即la:

    Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}"
    
        2
  •  0
  •   Mark Pearl    15 年前

    当我使用MVVM模式传递事件时,我发现 Prism’s Event Aggregator

    因此,一般来说,如果我想在没有显式关系的视图模型之间传递事件(如delete),我将订阅一个视图模型以查找特定事件聚合,然后从适当的位置触发它。

    我确信这种方法有几种变体,所以它可能值得一看?