我意识到这是一篇旧帖子,但是有人可能会发现这很有用。假设您已将视图绑定到视图模型,则可以通过以下方式将ContextMenu.DataContext绑定到视图模型:
首先,将您的视图命名为UserControl ...为了简单起见,我通常将我的所有名称命名为This。然后记住我们的视图模型绑定到UserControl的DataContext,我们可以使用{Binding DataContext, ElementName=This}绑定到视图模型。
所以现在我们可以绑定到视图模型,我们必须将它与ContextMenu.DataContext连接起来。我使用对象的Tag属性和ContextMenu(PlacementTarget)作为该连接,在本例中为Grid:
...
然后,我们可以通过ContextMenu.DataContext属性绑定到PlacementTarget.Tag属性(在我们的例子中Grid的)访问该ContextMenu视图模型属性和命令:
"{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource
AncestorType=ContextMenu}}" CommandTarget="{Binding PlacementTarget,
RelativeSource={RelativeSource Self}}" />
请注意MenuItem.CommandTarget属性上的绑定。设置这确保了在其上提出的指定的命令目标元件是PlacementTarget,或在这种情况下,Grid。
另请注意CommandParameter绑定。这结合了PlacementTarget的DataContext,或在这种情况下Grid。该Grid的DataContext将从DataTemplate继承,因此,如果您使用的ICommand执行界面数据项被绑定到object参数在Command:
public bool CanExecuteDeleteFileCommand(object parameter)
{
return ((YourDataType)parameter).IsInvalid;
}
public void ExecuteDeleteFileCommand(object parameter)
{
Delete((YourDataType)parameter);
}或者,如果你正在使用某种形式的直接RelayCommand代表在您的视图模型:
public ICommand Remove
{
get
{
return new ActionCommand(execute => Delete((YourDataType)execute),
canExecute => return ((YourDataType)canExecute).IsInvalid);
}
}