为什么数据绑定文本菜单项不躲?
-
22-08-2019 - |
题
我wan't隐藏/使用数据绑定对象的某些属性格式在一个ContextMenu显示的菜单项。 但是,我的菜单项不隐瞒,他们的行为就好像他们的可见性将被设置为Visibility.Hidden(不Visibility.Collapsed,因为它确实是),什么是这种行为的原因是什么?
下面是一个例子:
XAML:
<Window x:Class="MenuTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="converter"/>
<DataTemplate x:Key="template">
<MenuItem Visibility="{Binding Visible, Converter={StaticResource converter}}" Header="{Binding Title}" />
</DataTemplate>
<ContextMenu x:Key="menu" ItemTemplate="{StaticResource template}"/>
</Window.Resources>
<Grid>
<Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="OnClick">Button</Button>
</Grid>
</Window>
和后面的代码:
public partial class Window1 : Window
{
public ObservableCollection<Item> list = new ObservableCollection<Item>();
public Window1()
{
InitializeComponent();
list.Add(new Item() { Title = "First", Visible = true }); ;
list.Add(new Item() { Title = "Second", Visible = false }); ;
list.Add(new Item() { Title = "Third", Visible = false }); ;
list.Add(new Item() { Title = "Fourth", Visible = true }); ;
}
private void OnClick(object sender, RoutedEventArgs e)
{
ContextMenu cm = FindResource("menu") as ContextMenu;
cm.PlacementTarget = e.OriginalSource as UIElement;
cm.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
cm.ItemsSource = list;
cm.IsOpen = true;
}
}
public class Item
{
public string Title { get; set; }
public bool Visible { get; set; }
}
结果是具有四个项目菜单(但有两个在中部而没有头的可见文本)。
解决方案
此行为是因为文本菜单的的ItemTemplate将在的MenuItem的该项目创建适用于每个绑定物品的。通过将一个菜单项到您的DataTemplate,您创建一个嵌套菜单项。即使在折叠的内一个,由于外一个仍然是可见的,仍然有它的空间。
您可以在您的DataTemplate摆脱嵌套的菜单项,并解决这个问题有一个TextBlock替换它,使用适用于菜单项样式设置可见性:
<Window x:Class="MenuTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="converter"/>
<DataTemplate x:Key="template">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
<ContextMenu x:Key="menu" ItemTemplate="{StaticResource template}">
<ContextMenu.Resources>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Visibility" Value="{Binding Visible, Converter={StaticResource converter}}"/>
</Style>
</ContextMenu.Resources>
</ContextMenu>
</Window.Resources>
<Grid>
<Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="OnClick">Button</Button>
</Grid>
</Window>
不隶属于 StackOverflow