Я пытаюсь следовать этому ответу о том, как создать контекстное меню MVVM в WPF. Это звучит достаточно просто: «ItemTemplate для элементов контекстного меню теперь может получить доступ к имени, команде и тому, что вам может понадобиться».
Нет упоминания об изменении контекста данных, визуальных деревьев и т. Д.
Вот мой ViewModel:
public class ViewModel
{
public class ContextAction : INotifyPropertyChanged
{
public string HeaderText;
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
public ObservableCollection<ContextAction> ContextMenuActions { get; set; }
public ViewModel()
{
ContextMenuActions = new ObservableCollection<ContextAction>();
ContextMenuActions.Add(new ContextAction { HeaderText = "Foo" });
ContextMenuActions.Add(new ContextAction { HeaderText = "Bar" });
ContextMenuActions.Add(new ContextAction { HeaderText = "Baz" });
}
}
... и мой XAML:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<Grid Background="red">
<Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextMenuActions}">
<ContextMenu.ItemTemplate >
<DataTemplate DataType="MenuItem">
<MenuItem Header="{Binding HeaderText}" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</Window>
Я вижу, что элементыдобавить в контекстное меню. Щелчок правой кнопкой мыши по сетке приводит к появлению меню с тремя пустыми элементами. Однако привязки заголовка не работают (каждый пункт меню пуст). Я что-то упустил из ответа, который я связал? Нужно ли создавать какой-то прокси-класс , как упомянуто здесь ? Это кажется довольно запутанным для такой простой задачи, как создание контекстного меню, и даже в первом ответе, на который я ссылаюсь, даже не намекают.