WPF hide MenuItem en ContextMenu basado en la propiedad del objeto
-
20-08-2019 - |
Pregunta
Necesito mostrar / ocultar programáticamente un MenuItem, ¿cuál sería la mejor manera de hacer esto?
Solución
Bueno, para agregar un MenuItem necesitará algo en este sentido:
var menuItem = new MenuItem() { Header = "Menu Name", Name = "Identifier", IsCheckable = true, IsChecked = visible };
menuItem.Click += new RoutedEventHandler(contextMenu_onClick);
int position = contextMenu.Items.Add(menuItem);
(pero probablemente ya tienes esto).
Necesitará alguna forma de vincular el elemento del menú a la propiedad, pero sin ver su aplicación, realmente no puedo sugerir la mejor manera. Existe la propiedad Tag que almacena un objeto; la propiedad Uid que almacena una cadena; la propiedad Nombre que también almacena una cadena.
Mientras:
menuItem.Visibility = Visibility.Visible;
y
menuItem.Visibility = Visibility.Collapsed;
debería alternar la visibilidad del elemento.
EDITAR: el uso de Contraer ocultará el elemento del menú y no reservará espacio en el menú; realmente no desea espacios en blanco en un menú contextual. (gracias a Botz3000 por esto)
Luego, en su código donde se cambia el valor de la propiedad, encontrará el elemento del menú que desea mostrar / ocultar utilizando el enlace que describí anteriormente. Una vez que tenga el artículo, puede cambiar su valor:
menuItem.Visibility = menuItem.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
Otros consejos
¿Estás seguro de que quieres ocultar el MenuItem
? Es más común deshabilitarlo, utilizando el marco de mando de WPF:
<MenuItem Header="_MenuName" Command="{x:Static local:MyCommands.SomeCommand}" />
...
<!-- In the menu item or any of its ancestors: -->
<SomeControl.CommandBindings>
<CommandBinding Command="{x:Static local:MyCommands.SomeCommand}" Executed="Save_Executed" CanExecute="Save_CanExecture" />
</SomeControl.CommandBindings>
WPF usará el resultado bool
de Save_CanExecute
para determinar si el comando de <=> puede ejecutarse actualmente, y habilitará / deshabilitará el <=> en consecuencia.