我有一个WPF项目(C#,MVVM Light,Visual Studio 2010)。
我对关注点分离(MVVM)有一点问题,基本上就是这样:我在视图模型中有一个命令。我有一个上下文菜单,我想调用该命令。到现在为止还挺好。问题是该命令需要协调鼠标单击的坐标。
更具体一点,只有在单击特定的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>
所以现在我在视图模型中的命令看起来像这样:
void AddNewNodeAtLocationExecute(RoutedEventArgs e)
{
return;
}
在这种方法中,我想得到那些鼠标坐标,但我不知道是否可能。 e.OriginalSource是'MenuItem',这没什么用。
那我该怎么做呢?我可以这样做吗?或者我应该只用后面的代码处理这一个命令?所述代码将涉及对数据库的调用,这就是为什么我对分离这么特别。
提前致谢。
答案 0 :(得分:0)
好吧,我偶然发现了this question,其中提到了关注点的分离以及不关注的问题。
最后,我将两个想法合并在一起。首先,ContextMenu只是链接到后面的代码。那时我得到了我想要的坐标。然后,后面的代码获取视图的DataContext(我想要的命令所在的位置)并调用Execute方法(首先检查了&#39; can&#39;方法)。
我认为它和你一样理想。