WPF在viewmodel

时间:2017-10-12 19:49:12

标签: c# wpf mvvm

我有一个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',这没什么用。

那我该怎么做呢?我可以这样做吗?或者我应该只用后面的代码处理这一个命令?所述代码将涉及对数据库的调用,这就是为什么我对分离这么特别。

提前致谢。

1 个答案:

答案 0 :(得分:0)

好吧,我偶然发现了this question,其中提到了关注点的分离以及不关注的问题。

最后,我将两个想法合并在一起。首先,ContextMenu只是链接到后面的代码。那时我得到了我想要的坐标。然后,后面的代码获取视图的DataContext(我想要的命令所在的位置)并调用Execute方法(首先检查了&#39; can&#39;方法)。

我认为它和你一样理想。