MVVM/Commands and ControlTemplates

3
我正在尝试使用MVVM / Commands和ControlTemplates。 我要做的事情非常简单。我想要一个人员列表,用户可以在其中触发每个人的操作。但是事件/命令处理程序不需要在人员对象上执行,例如,因为我希望通过按钮从列表中删除它。
到目前为止,我所做的是创建了一个VM,公开了PersonVM列表,其中每个都包含我的person对象。 然后我创建了一个带有控件模板的CustomControl,其中包括一个ItemsControl,用于显示我的人员。
所有数据都很好地显示出来,没有问题。
然后,我尝试添加允许用户从列表中删除人员的部分。 所以我在datatemplate中添加了一个按钮。 仍然没有问题。
接下来的步骤是公开由按钮触发的命令。
第一种方法是使用Josh Smith的RelayCommand。 因此,我将其中一个添加到PersonViewModel,并将其绑定到按钮。 它有效,但问题是我需要引发一个事件(在命令执行后),父vm必须处理该事件。 在我看来,这不好,随着越来越多的命令,代码似乎对我来说很混乱。
因此,我重新设计了一切,以使用RoutedCommand,并尝试在控件层次结构的较高级别上添加CommandBinding。 但是,由于控件模板不允许我在viewmodel上调用方法,因此这是不可能的。
因此,我想知道该问题的正确解决方案是什么? 不知为何,我认为我走错了路,但我不知道在哪里。
2个回答

2

我曾经做过一件事情,虽然可能有点凌乱,但是它确实有效。我使用了RelativeSource绑定来沿着逻辑树向上遍历DataContext(或命令绑定),如下所示:

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}"

我的主模型没有暴露命令,而我的子虚拟机却暴露了它,因此在我的情况下这不起作用。 - Martin Moser

0

当我使用MVVM模式传递事件时,我发现Prism的事件聚合器非常有用。它允许您处理松散耦合的通信。

一般来说,如果我想传递像删除这样的事件到没有明确关系的视图模型中,我会订阅一个视图模型以查找特定的事件聚合,并从适当的位置触发该事件。

我相信这种方法有几个变体,所以值得一看?


不错的方法,但在我看来还需要更多,因为在我看来CommandBindings正是为了我的目的而设计的... - Martin Moser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接