我的用户控件上下文菜单可见性无法绑定依赖项属性。有什么想法吗?
这是我的WPF代码
<UserControl.ContextMenu>
<ContextMenu Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}">
<MenuItem Command="local:GCommands.Edit" />
<MenuItem Command="local:GCommands.Delete" />
<MenuItem Command="local:GCommands.ExportFcsFiles" />
<MenuItem Command="local:GCommands.BatchExportStatistics" />
<Separator/>
<MenuItem Command="local:GCommands.SaveAs" Header="Save As..." />
</ContextMenu>
</UserControl.ContextMenu>
如果我设置Visibility =“Hidden”,它对我有效。 像这样:
<ContextMenu Visibility="Hidden"/>
如果使用它将无效
<ContextMenu Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}">
我很确定Visibility =“{Binding ElementName = wellControl,Path = IsInCompactMode,Converter = {StaticResource BooleanToVisibilityConverter}}”没有问题,因为它适用于其他人。
这是我的依赖属性
public bool IsInCompactMode
{
get {return (bool)GetValue(IsInCompactModeProperty); }
set {SetValue(IsInCompactModeProperty, value); }
}
public static readonly DependencyProperty IsInCompactModeProperty =
DependencyProperty.Register("IsInCompactMode", typeof(bool), typeof(WellControl), new PropertyMetadata(false));
我试过这种方式,似乎它仍然不起作用,这真的很奇怪!!!
<ContextMenu x:Name="menu" IsOpen="{Binding ElementName=wellControl, Path=IsInCompactMode}">
我真的很困惑,怎么了? “绑定ElementName = wellControl,Path = IsInCompactMode”适用于用户控件的其他部分,只是不适用于奇怪的上下文菜单?它没有成功
答案 0 :(得分:8)
1&GT; ContextMenu,Popups,DataGridColumns不是可视树的一部分。所以使用ElementName
或RelativeSource
的绑定就不会那样。
2 - ; 如果您希望在特定情况下不显示上下文菜单,请使用触发器从视觉本身取消设置上下文菜单。
<TextBlock Text="ContextMenu is not shown when DataContext.IsShow is false"}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="ContextMenu"
Value="{StaticResource TextBlockContextMenu}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsShow}"
Value="False">
<Setter Property="ContextMenu"
Value="{x:Null}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
3&GT;要将这些项附加到可视树中,以便绑定起作用,我们使用代理元素方法...
Bind datagrid column visibility MVVM
我更喜欢第二步。
答案 1 :(得分:0)
如果您要显示/隐藏上下文菜单,则应使用IsOpen
的{{1}}属性,而不是ContextMenu
属性。
答案 2 :(得分:-1)
您应该添加更新触发器:&#34; UpdateSourceTrigger = PropertyChanged&#34;
<DataGrid.ContextMenu >
<ContextMenu Visibility="{Binding IsSelectionEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource BooleanToVisibilityConverter}}" >
<ContextMenu.Items>
<MenuItem Header="Create Layer" Command="{Binding DefineLayerName }" />
</ContextMenu.Items>
</ContextMenu>
</DataGrid.ContextMenu>