Как привязать к контекстному заголовку MenuItem в WPF MVVM? - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь следовать этому ответу о том, как создать контекстное меню 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>

Я вижу, что элементыдобавить в контекстное меню. Щелчок правой кнопкой мыши по сетке приводит к появлению меню с тремя пустыми элементами. Однако привязки заголовка не работают (каждый пункт меню пуст). Я что-то упустил из ответа, который я связал? Нужно ли создавать какой-то прокси-класс , как упомянуто здесь ? Это кажется довольно запутанным для такой простой задачи, как создание контекстного меню, и даже в первом ответе, на который я ссылаюсь, даже не намекают.

1 Ответ

1 голос
/ 15 октября 2019

Вы можете связать только с свойствами , а не полями .

public string HeaderText {get; set;}

enter image description here

...