/ / Чому елементи ContextMenu, прив'язані до даних, не приховують? - wpf, прив'язка даних, контекстне меню, пункт меню

Чому ці дані ContextMenu не ховаються? - wpf, прив'язка даних, контекстменю, меню menum

Я не хочу приховувати / показувати елементи меню в контекстному менювикористовуючи деяку власність об’єкта, пов’язаного з даними. Але мої пункти меню не приховують, вони поводяться так, ніби їх видимість буде встановлена ​​на Видимість. Прихована (а не Видимість. Згорнута, як це насправді), в чому причина такої поведінки?

Ось приклад:

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; }
}

Результат - меню з чотирма пунктами (але двома посередині, без видимого тексту в заголовку).

Відповіді:

3 для відповіді № 1

Ця поведінка пов’язана з тим, що ItemTemplate з ContextMenu буде застосовано до кожного з ваших пов’язаних елементів в межах пункт MenuItem, створений для цього елемента. Помістивши MenuItem у ваш DataTemplate, ви створюєте вкладений MenuItem. Навіть якщо ви згорнете внутрішній, оскільки зовнішній все ще видно, для нього все ще є місце.

Ви можете це виправити, позбувшись вкладеного MenuItem у ваш DataTemplate і замінивши його на TextBlock, а також використовуючи стиль, який застосовується до MenuItem, щоб встановити Visibility:

<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>