我开始使用MVVM,但是我发现很难复制我对事件所做的简单事情:我有一个画布,我想得到鼠标单击的位置,所以我执行了一个命令,xaml是这样的
<Canvas x:Name="cnvLeft"> <i:Interaction.Triggers> <i:EventTrigger EventName="PreviewMouseDown"> <cmd:EventToCommand Command="{Binding CanvasClick}" PassEventArgsToCommand="True"/> </i:EventTrigger> </i:Interaction.Triggers> </Canvas>
然而,它只传递鼠标参数,这是不够的,因为我需要发送者,我如何解决这个问题?
发布于 2022-09-29 13:56:53
建议:为鼠标单击事件注册一个公共事件处理程序。
MVVM与代码隐藏无关。使用代码隐藏是绝对好的,甚至是必要的。
代码隐藏文件是一个编译器特性,即语言特性(部分类)。它们与应用程序体系结构无关。MVVM不关心编译器--没有设计模式这样做。
MVVM也不关心命令(或数据绑定或任何框架概念)。命令是框架基础结构的一部分,MVVM不关心框架--没有设计模式。
MVVM并不意味着使用命令。事件通常也一样好。所以不要强迫命令。不要使用交互行为将输入事件转换为命令,只需直接处理事件(当然是在视图中)。
控件必须始终在MVVM应用程序的视图中处理。控件的代码隐藏文件是一个部分类。它是控件的一部分,因此也是视图的一部分。
在宿主控件的代码隐藏中实现用户输入事件处理程序。在这里,您必须实现 Canvas 相关逻辑(UI逻辑)。
Canvas
如果要封装逻辑,可以将其与 Canvas 一起移动到新的自定义 Control (或 UserControl )。
Control
UserControl
MainWindow.xaml
<Window>