Поэтому я решил попробовать и реализовать командное решение. Я очень доволен тем, как это работает сейчас.
Сначала создал мою команду:
public static class CustomCommands
{
public static RoutedCommand DisplayMetadata = new RoutedCommand();
}
Затем в своем настраиваемом элементе управления списком я добавил новую привязку команды к конструктору:
public SortableListView()
{
CommandBindings.Add(new CommandBinding(CustomCommands.DisplayMetadata, DisplayMetadataExecuted, DisplayMetadataCanExecute));
}
А также там добавлены обработчики событий:
public void DisplayMetadataExecuted(object sender, ExecutedRoutedEventArgs e)
{
var nbSelectedItem = (MyItem)e.Parameter;
// do stuff with selected item
}
public void DisplayMetadataCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
e.Handled = true;
}
Я уже использовал селектор стилей для динамического назначения стилей элементам списка, поэтому вместо того, чтобы делать это в xaml, я должен установить привязку в коде позади. Вы можете сделать это и в xaml:
public override Style SelectStyle(object item, DependencyObject container)
{
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(container);
MyItem selectedItem = (MyItem)item;
Style s = new Style();
var listMenuItems = new List<MenuItem>();
var mi = new MenuItem();
mi.Header= "Get Metadata";
mi.Name= "cmMetadata";
mi.Command = CustomCommands.DisplayMetadata;
mi.CommandParameter = selectedItem;
listMenuItems.Add(mi);
ContextMenu cm = new ContextMenu();
cm.ItemsSource = listMenuItems;
// Global styles
s.Setters.Add(new Setter(Control.ContextMenuProperty, cm));
// other style selection code
return s;
}
Мне нравится ощущение этого решения гораздо лучше, чем пытаться установить поле при щелчке мыши и пытаться получить доступ к тому, что щелкнуло таким образом.