Я не хочу скрывать / показывать пункты меню в контекстном меню, используя некоторые свойства объекта, связанного с данными.
Но мои пункты меню не скрывают, они ведут себя так, как будто их Visiblity будет установлен на Visibility.Hidden (не Visibility.Collapled, как на самом деле), в чем причина такого поведения?
Вот пример:
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; }
}
В результате получается меню с четырьмя пунктами (но двумя посередине без видимого текста в заголовке).