我开始使用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
一起移动到新的自定义Control
(或UserControl
)。
MainWindow.xaml
<Window>
<Canvas PreviewMouseDown="OnCanvasePreviewMouseDown" />
</Window>
MainWindow.xaml.cs
private void OnCanvasePreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var canvas = sender as Canvas;
Point canvasClickPosition = e.GetPosition(canvas);
}
https://stackoverflow.com/questions/73879992
复制相似问题