mvvm设计模式和在wpf中的实现事件绑定

DotNet笔记 DotNet笔记     2022-09-04     180

关键词:

系列目录:

MVVM模式解析和在WPF中的实现(一)MVVM模式简介

MVVM模式解析和在WPF中的实现(二)数据绑定

MVVM模式解析和在WPF中的实现(三)命令绑定

MVVM模式解析和在WPF中的实现(四)事件绑定

MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信 

MVVM模式解析和在WPF中的实现(六)用依赖注入的方式配置ViewModel并注册消息

0x00 为什么要事件绑定

这个问题其实是很好理解的,因为事件是丰富多样的,单纯的命令绑定远不能覆盖所有的事件。例如Button的命令绑定能够解决Click事件的需求,但Button的MouseEnter、窗体的Loaded等大量的事件要怎么处理呢?这就用到了事件绑定。

0x01 事件绑定

要使用事件绑定需要借助System.Windows. interactivity,如果安装了Blend,里面就包含了这个dll。需要在Interaction.Triggers里面添加一个或多个EventTrigger并指定关注的的事件名称,在EventTrigger中通过InvokeCommandAction来绑定事件对应的命令。图中所示绑定了主窗口的Loaded事件,在事件触发后会调用绑定的命令对象LoadedCommand的Execute方法执行命令,当命令绑定需要参数时可以通过绑定CommandParameter实现。需要指出的是之前在实现MyCommand的Execute方法时我们加入了CanExecute的判断,因此事件触发后是否能够真正执行绑定的命令也受到绑定的LoadedCommand的CanExecute方法的影响。

 

0x02 带EventArgs参数的事件绑定

上面介绍的事件绑定并不足以应对所有的情况,因为很多情况下我们还需要从事件的EventArgs中获取数据,例如从MouseMove事件参数中获取鼠标位置和按键状态等。但InvokeCommandAction在未对CommandParameter绑定的情况下给Execute方法传递的参数为null。因此我们需要自己写一个类来处理事件到命令的绑定。

 

看一下上面我们用到的InvokeCommandAction,继承自TriggerAction<DependencyObject>,TriggerAction是一个抽象类,我们只要继承这个类并实现Invoke方法即可。TriggerAction在MSDN中的介绍如下:

https://msdn.microsoft.com/zh-cn/library/system.windows.interactivity.triggeraction(v=expression.40).aspx

我简单实现了以下,代码如下图所示,其中依赖项属性是借助propdp代码段生成的,要不实在记不住,输入那么多代码也好麻烦。使用的时候用来代替之前的InvokeCommandAction,不绑定CommandParameter则传递的就是事件的参数。如果绑定了CommandParameter,那么传递的就是绑定的参数。

0x03 事件绑定的示例

有了MyEventCommand我们就可以绑定事件并获取事件参数了。实例中绑定了窗体的Loaded事件和MouseMove事件,其中在MouseMove事件中我们使用自己的MyEventCommand对象接收事件对象,并显示出鼠标相对于窗体的位置以及各个按键的状态。

 示例程序运行后如下所示

0x04 相关下载

https://github.com/durow/TestArea/tree/master/MVVMTest/EventBindingTest

wpf事件实现mvvm中的command绑定(代码片段)

1.在ViewModel中弹出消息提示框,需要添加下面的代码块:<dxmvvm:Interaction.Behaviors><dx:DXMessageBoxService/></dxmvvm:Interaction.Behaviors>在ViewModel中的调用方式是:publicvirtualvoidShowRowDetails(SampleDataobj) 查看详情

wpf在mvvm模式下实现窗口后台代码与viewmodel交互

...aded事件中添加绑定的ViewModel 使用vm就可以访问ViewModel中的变量或方法。  2在ViewModel中添加绑定窗口的引用  使用wndBindingWindow可以访问窗口后台代码中的变量或方法。  查看详情

2021-09-29wpf上位机50-mvvm模式数据绑定(代码片段)

MVVM模式中的基本内容绑定1、数据绑定:依赖属性:数据Model必须继承DependencyObject属性名称+Changed事件:固定写法INotifyPropertyChanged接口:形成一种契约2、基于Model的数据验证ExceptionRequired、StringLength、Range、RegularExpression、CustomMode... 查看详情

2021-10-02wpf上位机54-mvvm模式中的鼠标行为与命令绑定(代码片段)

MVVM模式中的鼠标行为与命令绑定1、鼠标输入的命令绑定(InputBindings:)单击鼠标左键:LeftClick双击鼠标左键:LeftDoubleClick单击鼠标中键:MiddleClick双击鼠标中键:MiddleDoubleClick单击鼠标右键:RightClick双击鼠标右键:RightDoubleClick不执行任... 查看详情

wpf中的command事件绑定

在项目中使用Command绑定能够使我们的代码更加的符合MVVM模式。不了解的同学可能不清楚,只有继承自ButtonBase类的元素才可以直接绑定Command(Button、CheckBox、RadioButton等)<ButtonContent="Normal"Command="{BindingNormalEventCommand}"></Butt... 查看详情

WPF MVVM 文本框文本绑定与 changedText 事件

...到文本框(这很好),并且当文本框失去焦点时视图模型中的文本会刷新(这对我来说很糟糕)。如 查看详情

在 MVVM 中的 Datagrid 中绑定 WPF 组合框不保存更改

...时间】:2011-06-2415:32:13【问题描述】:我有一个使用MVVM设计模式定义的DataGrid:<DataGridMargin="10"Height="385"Width="1000"ItemsSource="BindingInsp 查看详情

note7:mvvm模式之数据绑定

...nbsp;数据绑定 (DataBinding)是WPF最重要的特性之一,也是实现 MVVM(WPF) 模式的一大支柱。 简而言之,数据绑定就是将两个属性绑定在一起,源属性(source)改变带动目标属性(target)一起改变。这样也减少了事 查看详情

正确的 MVVM 模式 WPF 命令实现

】正确的MVVM模式WPF命令实现【英文标题】:CorrectMVVMpatternWPFCommandimplementation【发布时间】:2017-12-0617:44:18【问题描述】:我正在尝试按照MVVM模式实现命令,但我被这个特定场景所困。在XAML中,我将命令绑定到列内的按钮:<dx... 查看详情

wpf:mvvm模式下viewmodel关闭view

...一、消息通知利用View里的IsEnable属性原理是这样的:1、UI中的IsEnabled绑定VM中的属性2、UI的后台代码中,注册IsEnableChange事件,在这个事件里,检测到传过来的值满足某个条件,即可触发Close()命令如此,VM控制自己那个属性就能... 查看详情

wpf中的mvvm模式简单实现(代码片段)

前言:在之前实现WPF程序时,我们可能会把所有的后台逻辑都放在视图的后台文件中,这样的实现方式的好处更直观,方便,对于一些小的应用程序这样做当然没什么问题,但是对于复杂的应用程序这样写的话,可能会导致后台... 查看详情

如何使用 MVVM 模式“禁用”WPF 中的按钮?

】如何使用MVVM模式“禁用”WPF中的按钮?【英文标题】:Howdoesone"disable"abuttoninWPFusingtheMVVMpattern?【发布时间】:2011-03-2910:45:06【问题描述】:我正在尝试掌握WPF和MVVM并取得了不错的进展。WPF和MVVM方面进展顺利。但是,XA... 查看详情

wpf利用附加属性创建freezablecollection集合和反射实现控件参数以mvvm模式传递

...eezableCollection集合和反射实现控件参数以MVVM模式传递本文中的例子本质上就是利用附加属性传递附加对象,并在观察者模式中使用反射技术实现指定名称的事件参数传递。本文中框架任然有很多问题,目前来说是勉强能用,有可... 查看详情

将事件绑定到 ViewModel

...是MVVM(Model-View-ViewModel),我试图将MouseLeftButtonUp事件从View中的代码隐藏带到ViewModel(因此该事件将符合MVVM规则)。现在我有这个:View.xaml:<Data 查看详情

使用 MVVM 绑定 WPF DataGridComboBoxColumn

...述】:我查看了variousquestions的答案,但没有设法将答案中的内容映射到我试图解决的问题。我已将其缩减为以下代码(代表我试图实现的结果),并且基本上希望能够在未编辑行时将Person.TitleId呈现为其 查看详情

WPF DataGridTemplateColumn 与 ComboBox 绑定(MVVM 模式)

】WPFDataGridTemplateColumn与ComboBox绑定(MVVM模式)【英文标题】:WPFDataGridTemplateColumnwithComboBoxBinding(MVVMpattern)【发布时间】:2011-10-2815:10:56【问题描述】:我对下面的WPFDataGrid+ComboBox方案非常感兴趣。我有一组看起来像的类;classOwne... 查看详情

WPF 将 UI 事件绑定到 ViewModel 中的命令

】WPF将UI事件绑定到ViewModel中的命令【英文标题】:WPFBindingUIeventstocommandsinViewModel【发布时间】:2011-06-2107:57:40【问题描述】:我正在重构一个简单的应用程序以遵循MVVM,我的问题是如何将SelectionChanged事件从我的代码中移出到vi... 查看详情

WPF MVVM 数据绑定问题

...:52:39【问题描述】:有人可以解释为什么在使用以下代码实现的WPF扩展控件“BusyIndi​​cator”中未使用在CodeBehind中分配的ViewModel:ViewModel实现:publicpartialclassApp:ApplicationprivatevoidOnStartup(object 查看详情