我目前正在使用MVVM/命令和ControlTemplates。我想要做的很简单。我想要有一个列表,例如人员,其中用户可以触发他们每个人的行动。但是事件/命令处理程序不需要在person对象上执行,例如,因为我想用一个按钮将其从列表中删除。
因此,到目前为止,我所做的是创建一个VM,它公开PersonVM的列表和每个持有我的person对象。然后,我创建了一个带有控件模板的CustomControl,其中包含一个显示我的人员的ItemsControl。
所有数据都显示得很好,没有任何问题。
然后,我尝试添加允许用户从列表中删除人员的部分。所以我在数据模板上添加了一个按钮。这仍然不是问题。
下一步是公开一个由按钮触发的命令。
第一种方法是使用Josh Smiths RelayCommand。因此,我将其中一个添加到PersonViewModel,并将其绑定到按钮。它可以工作,但问题是我需要引发一个事件(在命令执行后),父vm必须处理该事件。我觉得这并不好,因为越来越多的命令让我觉得代码很乱。
因此,我重新编写了所有内容以使用RoutedCommand,并尝试在控件层次结构中的更高级别添加一个CommandBinding。但这是不可能的,因为ControlTemplate不允许我在视图模型上调用方法。
所以我想知道解决这个问题的正确方法是什么?不知何故,我相信我在错误的轨道上,但我看不到在哪里。
蒂娅·马丁
发布于 2010-01-01 00:24:05
我所做的一些有用的事情,如果可能有点混乱,就是使用RelativeSource绑定在逻辑树上遍历DataContext (或命令绑定),例如:
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}"发布于 2010-01-01 15:46:25
当我使用MVVM模式传递事件时,我发现Prism’s Event Aggregator非常有用。它允许您处理松散耦合的通信。
因此,一般来说,如果我想在没有显式关系的视图模型之间传递像delete这样的事件,我将订阅one View Model来查找特定的事件聚合,然后从适当的位置触发它。
我相信这种方法有几种变体,所以它可能值得一看?
https://stackoverflow.com/questions/1985135
复制相似问题