/ / Dlaczego elementy menu kontekstowego ContextMenu się nie chowają? - wpf, powiązanie danych, menu kontekstowe, menu

Dlaczego pozycje kontekstu w menu kontekstowym nie są ukrywane? - wpf, powiązanie danych, menu kontekstowe, menuitem

Nie chcę ukrywać / pokazywać menu w menu kontekstowymużywając pewnej własności obiektu databound. Ale moje menu nie chowają się, zachowują się tak, jakby ich Widzialność była ustawiona na Widoczność. Ukryty (nie Widoczność. Tak naprawdę jest zwinięty), jaki jest powód takiego zachowania?

Oto przykład:

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>

I kod:

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

Rezultatem jest menu z czterema elementami (ale dwoma w środku bez widocznego tekstu w nagłówku).

Odpowiedzi:

3 dla odpowiedzi № 1

To zachowanie jest spowodowane tym, że ItemTemplate ContextMenu zostanie zastosowany do każdego z powiązanych elementów w ciągu element menu utworzony dla tego elementu. Umieszczając MenuItem w DataTemplate, tworzysz zagnieżdżone MenuItem. Nawet jeśli zwiniesz wewnętrzny, ponieważ zewnętrzny jest nadal widoczny, wciąż jest na to miejsce.

Możesz to naprawić, pozbywając się zagnieżdżonego MenuItem w DataTemplate i zamieniając go na TextBlock, i używając stylu, który dotyczy MenuItem, aby ustawić Widoczność:

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