我有一个WPF项目(C#,MVVM Light,Visual Studio 2010)。
关于关注点分离(MVVM),我有一个问题,基本上是这样的:我在 View 模型中有一条命令。我有一个上下文菜单,我想调用该命令。到目前为止,一切都很好。问题在于该命令需要协调鼠标的单击。
更具体一点,只有在单击特定的Canvas控件时才会显示ContextMenu,而这正是我想要的上述Canvas控件中的坐标。
做到这一点的简单方法是在XAML文档后面的代码中进行全部管理(并且我已经能够做到这一点),但是如果可以的话,我宁愿将其包含在ViewModel中。原因是此命令中存在对我的数据模型的调用,因此最终导致分离问题。
我知道PassEventArgsToCommand,但我知道这是一个不好的做法,但是在这种情况下,我不确定是否可以解决。所以目前我确实尝试过,看起来像这样:
<ContextMenu x:Key="BackgroundMenu">
<MenuItem Header="Add new node here">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext.AddNewNodeAtLocationCommand}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
因此,现在我的命令在 View 模型中如下所示:
void AddNewNodeAtLocationExecute(RoutedEventArgs e)
{
return;
}
在这种方法中,我想获取那些鼠标坐标,但是我不知道是否可能。 e.OriginalSource是'MenuItem',并没有太大帮助。
那我该怎么做呢?我可以这样做吗?还是应该仅由后面的代码处理这一命令?所说的代码将涉及对数据库的调用,这就是为什么我对分离如此特别的原因。
提前致谢。
最佳答案
好吧,我偶然发现了this question,它谈到关注点分离和不关注点分离。
最后,我将我的两个想法合并了。首先,ContextMenu只是链接到后面的代码。到那时,我得到了想要的坐标。然后,后面的代码获取 View 的DataContext(我想要的命令所在的位置)并调用Execute方法(首先检查了'can'方法)。
我想这与您将要实现的理想。
关于c# - WPF在 View 模型中获取鼠标坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717765/