En la aplicación WPF hay un Grid
con varios objetos (se derivan de un control personalizado). Quiero realizar algunas acciones en cada una de ellas mediante el menú de contexto:Cómo hacer referencia al objeto con el botón derecho en el elemento de menú contextual de WPF, haga clic en el controlador de eventos.
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Click="EditStatusCm_Click"/>
</ContextMenu>
</Grid.ContextMenu>
Pero en el controlador de eventos que no me puedo saber cuál de los objetos era derecho de clics:
private void EditStatusCm_Click(object sender, RoutedEventArgs e)
{
MyCustControl SCurrent = new MyCustControl();
MenuItem menu = sender as MenuItem;
SCurrent = menu.DataContext as MyCustControl; // here I get a run-time error
SCurrent.Status = MyCustControl.Status.Sixth;
}
En esa línea comentada El depurador dice: Referencia de objeto no establecida en una instancia de un objeto.
Por favor, ayuda, ¿qué hay de malo en mi código?
Editado (añade):
Me trataron de hacer lo mismo, usando Comando enfoque:
I declaró una Clase DataCommands
con RoutedUICommand Requery
y luego se usa Window.CommandBindings
<Window.CommandBindings>
<CommandBinding Command="MyNamespace:DataCommands.Requery" Executed="RequeryCommand_Executed"></CommandBinding>
</Window.CommandBindings>
XAML de MenuItem ahora se ve así:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Command="MyNamespace:DataCommands.Requery"/>
</ContextMenu>
</Grid.ContextMenu>
Y controlador de eventos se parece a:
private void RequeryCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
IInputElement parent = (IInputElement)LogicalTreeHelper.GetParent((DependencyObject)sender);
MyCustControl SCurrent = new MyCustControl();
SCurrent = (MuCustControl)parent;
string str = SCurrent.Name.ToString();// here I get the same error
MessageBox.Show(str);
}
Pero depurador muestra el mismo error en tiempo de ejecución: referencia a objeto no establecida como instancia de un objeto.
¿Qué falta en mis dos enfoques?
Cómo debo hacer referencia al objeto que ha hecho clic derecho en el elemento de menú contextual de WPF, haga clic en el controlador de eventos?
He intentado utilizar el enfoque del sistema como más WPF-ish, pero tiene el mismo error. Edité mi pregunta y agregué los pasos de mi intento de aproximación al comando. Mi comprensión de cómo obtener la referencia del objeto cliqueado falta algo en ambos casos – rem