WPF MenuItem Команда ViewModel - PullRequest
       9

WPF MenuItem Команда ViewModel

3 голосов
/ 30 апреля 2010

Я довольно новичок в WPF и немного борюсь со сценарием. У меня есть меню, в котором есть пункты меню. При щелчке по одному из этих пунктов меню должен быть вызван метод, который будет делать что-то на основе отображаемого текста, связанного с этим пунктом меню. Так, например, содержимое пункта меню было «test», поэтому мне нужно было бы что-то сделать с «test». К вашему сведению, это «что-то» напрямую влияет на коллекцию в ViewModel.

Этого легко добиться, используя событие click без ViewModel, но я пытался реализовать MVVM, используя явную ViewModel. Поэтому я начал изучать команды, но не могу понять, как передать что-либо из представления обратно в команду в ViewModel.

Любые предложения о том, что я должен делать здесь?

Спасибо

Ответы [ 2 ]

5 голосов
/ 30 апреля 2010

Учитывая, что у вас есть коллекция предметов, управляющих командованием, я бы порекомендовал использовать что-то похожее на второе предложение Уилла, подобное этому:

<MenuItem
  Command="{Binding MenuCommand}"
  CommandParameter="{Binding}"
  Header="{Binding DisplayText}" />

На стороне ViewModel вы можете использовать DelegateCommand или RelayCommand для подключения вашего метода-обработчика. Это позволяет вам проверять данные пункта меню и делать все, что вам нужно, основываясь на том, что в нем есть.

public DelegateCommand<MyMenuObject> MenuCommand { get; private set; }

public ViewModel()
{
    MenuCommand = new DelegateCommand<MyMenuObject>(MenuCommandExecuted);
}

public void MenuCommandExecuted(MyMenuObject parameter)
{
    // do something based on the parameter object
}

Вам также необходимо либо передать MenuCommand в свойство ICommand элементов вашей коллекции, чтобы использовать приведенную выше простую форму привязки, либо изменить привязку команды, чтобы использовать что-то вроде RelativeSource FindAncestor для поиска дерева в DataContext родителя (ViewModel) для MenuCommand. Использование этого подхода позволяет гибко добавлять или удалять элементы из коллекции, и нет необходимости вносить какие-либо изменения в пользовательский интерфейс для поддержки нового набора элементов.

Prism DelegateCommand

RelayCommand

2 голосов
/ 30 апреля 2010

У вас есть два варианта.

  1. Предоставить ICommand для каждой команды меню, такой как «FileCommand», «EditCommand», «SaveCommand» и т. Д.
  2. Используйте CommandParameter для отправки информации обратно в Команду, например

    <MenuItem Command="{Binding MenuCommand}" CommandParameter="File">File</MenuItem>
    

Я думаю, что первый вариант лучше, так как он избегает волшебных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...