Я не хочу приховувати / показувати елементи меню в контекстному менювикористовуючи деяку власність об’єкта, пов’язаного з даними. Але мої пункти меню не приховують, вони поводяться так, ніби їх видимість буде встановлена на Видимість. Прихована (а не Видимість. Згорнута, як це насправді), в чому причина такої поведінки?
Ось приклад:
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>