首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM/命令和ControlTemplates

MVVM/命令和ControlTemplates
EN

Stack Overflow用户
提问于 2009-12-31 19:53:22
回答 2查看 928关注 0票数 3

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

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

所有数据都显示得很好,没有任何问题。

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

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

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

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

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

蒂娅·马丁

EN

回答 2

Stack Overflow用户

发布于 2010-01-01 00:24:05

我所做的一些有用的事情,如果可能有点混乱,就是使用RelativeSource绑定在逻辑树上遍历DataContext (或命令绑定),例如:

代码语言:javascript
复制
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}"
票数 2
EN

Stack Overflow用户

发布于 2010-01-01 15:46:25

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1985135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档