如何在MVVM中处理事件

8

我是MVVM模式的新手。我刚学习了这种模式,想在我的项目中使用它。我已经理解了这种模式的工作原理,并学会了如何使用命令。但是我有一个问题,如何处理其他控件的事件,例如ListBox的SelectionChanged事件。ListBox没有Command属性。


1
我没有使用过它,但是你可能可以使用CollectionView或CollectionViewSource在各种集合类型的控件上启用MVVM。 - Merlyn Morgan-Graham
3个回答

14

通常情况下,你不需要这样做。例如,你可以将 ListBoxSelectedItem 属性直接绑定到视图模型中的一个属性:

<ListBox ItemsSource="{Binding Customers}" SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"/>

这不仅使您的视图模型可以访问所选客户,还允许视图模型通过设置属性本身来指定所选客户。

还有其他技术可以“避免”在代码后台直接处理事件,例如附加行为。但是,如果代码仅涉及视图并使代码更简单,您不应该害怕直接处理事件。


有趣的想法。例如,我想在DataGrid上处理鼠标右键单击事件。在这种情况下,我必须在代码后台编写处理程序,还是必须使用附加行为? - Polaris
1
@ Polaris。看看现有的mvvm框架(如cinch,mvvm light ...)。你会发现像EventToCommand行为这样的实现,可以将事件绑定到命令上。就像Kent所说:在编写与视图相关的代码时,可以随意使用codebehind :) 例如,在网格或列表框中将选定的项目带入视图。 - blindmeis
对于评论中提到的仅影响视图层的事件处理,我表示赞同。很多人都会忘记这一点... - Cameron MacFarland

0

BookLibrary 应用程序是基于 WPF 应用程序框架 (WAF) 的,演示了如何在 Model-View-ViewModel (MVVM) 设计的应用程序中监听 WPF 事件。它允许用户选择多本书籍,以便一次性删除所有选中的书籍。请参阅 BookLibrary.Presentation.Views.BookView 类。


0

为了向您的控件添加命令属性,它必须从ICommandSource继承。 查看this帖子,了解如何完成此操作。


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