Frage

I wan't zu verstecken / show menuitems in einem contextmenu einige propery von Databound-Objekt. Aber meine menuitems nicht verbergen, sie verhalten sich, als ob ihr der Sichtbarkeit des würde Visibility.Hidden eingestellt werden (nicht Visibility.Collapsed, wie es wirklich ist), was ist der Grund für ein solches Verhalten?

Hier ist ein Beispiel:

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>

Und Code hinter:

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

Das Ergebnis ist Menü mit vier Punkten (aber zwei in der Mitte ohne sichtbaren Text in Kopfzeile).

War es hilfreich?

Lösung

Dieses Verhalten ist, weil die ItemTemplate von ContextMenu wird jedem Ihrer gebundenen Gegenstände angewendet werden innerhalb die MenuItem für diesen Artikel erstellt. Durch eine MenuItem in Ihre Datatemplate setzen, erstellen Sie eine verschachtelte MenuItem. Selbst wenn Sie die innere kollabieren, da die äußere noch sichtbar ist, gibt es noch Raum für sie.

Sie können dieses Problem beheben, indem dem verschachtelten MenuItem in Ihrem Datatemplate loszuwerden und es mit einem Textblock zu ersetzen, und mit einem Stil, der die Sichtbarkeit auf MENUITEM gilt einzustellen:

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top