MVVM /命令和ControlTemplates

时间:2009-12-31 11:53:22

标签: wpf mvvm command controltemplate

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

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

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

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

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

第一种方法是使用Josh Smiths RelayCommand。所以我将其中一个添加到PersonViewModel并将其绑定到按钮。 它可以工作,但问题是我需要引发父vm必须处理的事件(执行命令后)。 Imho不太好,因为越来越多的命令代码对我来说似乎很乱。

所以我重写了一切以使用RoutedCommand,并尝试在控件层次结构的更高级别添加CommandBinding。但这是不可能的,因为ControlTemplate不允许我在viewmodel上调用方法。

所以我想知道这个问题的正确方法是什么?不知怎的,我相信我走错了路,但我没看到。

TIA 马丁

2 个答案:

答案 0 :(得分:2)

我做过的有用的东西,如果可能有点乱,是使用RelativeSource绑定来走动DataContext(或命令绑定)备份逻辑树,la:

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

答案 1 :(得分:0)

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

所以一般来说,如果我想在没有显式关系的View Models中传递像删除这样的事件,我会订阅一个View Model来查找特定的事件聚合,然后从适当的位置触发它

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