3 回答
TA贡献1817条经验 获得超6个赞
如下所示:
PlacementTarget是拥有ContextMenu的控件(例如:DataGrid)。不需要“标签”属性。
IsEnabled绑定到DataGrid的“ myProperty”值。
我对此进行了测试,并且可以正常工作。绑定存在类似问题。
<ContextMenu
DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}"
IsEnabled="{Binding myProperty}"
>
TA贡献1744条经验 获得超4个赞
因为ContextMenu不在可视树中,所以绑定将不起作用。一个简单的解决方案是使用代理模式,你可以创建一个继承的包装类DependencyObject,并具有DependencyProperty将保持DataContext你的Window,那么你可以在XAML代理的资源,最后你的绑定MenuItem通过代理命令添加到您所需的命令宾语。
样本代理:
Public class ProxyClass : DependencyObject
{
Public object Data {get; set;}
public static readonly DependencyProperty DataProperty = DependencyProperty.Register("DataProperty", typeof(object), typeof(ProxyClass), new FrameworkPropertyMetadata(null));
}
如何在XAML中使用:
<Window DataContext="{Binding MyViewModel}">
...
<Window.Resources>
<ProxyClass Data={Binding} x:Key="BindingProxy"/>
</Window.Resources>
...
<MenuItem Command="{Binding Source={StaticResource BindingProxy}, Path=Data.MyDesiredCommand"/>
...
</Window>
怎么了?
Data财产ProxyClass将绑定到DataContext的Window,那么它所有的comamnds和你的属性ViewModel的内部ProxyClass资源。
这种方法的另一个好处是可移植性,并且可以在多个视图和项目中重复使用。
添加回答
举报