3

我目前正在使用 MVVM/Commands 和 ControlTemplates。我想做的很简单。我想要一个例如 Persons 的列表,用户可以在其中触发每个人的操作。但是事件/命令处理程序不需要在人员对象上执行,例如因为我想用一个按钮从列表中删除它。

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

所有数据都显示得很好,完全没有问题。

然后我尝试添加允许用户从列表中删除人员的部分。所以我在数据模板中添加了一个按钮。仍然不是问题。

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

第一种方法是使用 Josh Smiths RelayCommand。所以我将其中一个添加到 PersonViewModel 并将其绑定到按钮。它有效,但问题是我需要引发父虚拟机必须处理的事件(在执行命令之后)。恕我直言,这不好,因为随着越来越多的命令,代码对我来说似乎很乱。

因此,我重新设计了所有内容以使用 RoutedCommand,并尝试在控件层次结构的更高级别上添加 CommandBinding。但这是不可能的,因为 ControlTemplate 不允许我在视图模型上调用方法。

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

蒂亚·马丁

4

2 回答 2

2

如果可能有点混乱,我所做的一些工作是使用 RelativeSource 绑定将 DataContext (或命令绑定)带回逻辑树,例如:

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}"
于 2009-12-31T16:24:04.873 回答
0

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

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

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

于 2010-01-01T07:46:24.817 回答