programar - invocar evento c#
¿Cómo manejo los eventos de clic en un menú de datos enlazados en WPF? (4)
<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" Click="DataBoundMenuItem_Click" />
Código detrás..
private void DataBoundMenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem obMenuItem = e.OriginalSource as MenuItem;
MessageBox.Show( String.Format("{0} just said Hi!", obMenuItem.Header));
}
Los eventos se dispararán hasta el controlador común. A continuación, puede usar el texto del encabezado o mejorar la propiedad DataContext para cambiar y actuar según sea necesario
Tengo un MenuItem cuyo ItemsSource está enlazado a una simple lista de cadenas, se muestra correctamente, ¡pero estoy luchando para ver cómo puedo manejar los eventos de clics para ellos!
Aquí hay una aplicación simple que lo demuestra:
<Window x:Class="WPFDataBoundMenu.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Menu>
<MenuItem Header="File" Click="MenuItem_Click" />
<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" />
</Menu>
</Grid>
using System.Collections.Generic;
using System.Windows;
namespace WPFDataBoundMenu
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public List<string> MyMenuItems { get; set;}
public Window1()
{
InitializeComponent();
MyMenuItems = new List<string> { "Item 1", "Item 2", "Item 3" };
DataContext = this;
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("how do i handle the other clicks?!");
}
}
}
¡Muchas gracias!
Chris.
Puede hacer que cada elemento del menú ejecute el mismo comando, manejando así la ejecución centralmente. Si necesita distinguir elementos de menú más allá de la instancia de objeto real, también puede vincular el parámetro de comando:
<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{x:Static local:MyCommands.MyCommand}"/>
<Setter Property="CommandParameter" Value="{Binding SomeProperty}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
Se supone que SomeProperty
es una propiedad de cada elemento en su colección MyMenuItems
. Por lo tanto, su controlador de ejecución de comandos recibiría el valor de SomeProperty
para el elemento de menú particular al que se hace clic.
En mi humilde opinión, el controlador de eventos más general con la capacidad de obtener elementos de artículos
private void DataBoundMenuItem_Click(object sender, RoutedEventArgs e)
{
// get menu item with ItemsSource bound
var myItemsMenuItems = sender as MenuItem;
// get submenu clicked item constructed from MyMenuItems collection
var myItemsMenuSubItem = e.OriginalSource as MenuItem;
// get underlying MyMenuItems collection item
var o = myItemsMenuItems
.ItemContainerGenerator
.ItemFromContainer(myItemsMenuSubItem);
// convert to MyMenuItems type ... in our case string
var itemObj = o as (string);
// TODO some processing
}
Espero que ayude smbd!
Si desea una forma más simple de acceder al contenido del elemento del menú:
<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" Click="MenuItem_Click">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="CommandParameter" Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
Cod Behind:
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
var item = ((MenuItem)e.OriginalSource).CommandParameter;
}