2010-04-30 6 views
3

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

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

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

Thanks

ответ

5

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

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

Prism DelegateCommand

RelayCommand

2

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

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

< MenuItem Command = "{Binding} MenuCommand" CommandParameter = "Файл"> Файл </MenuItem>

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

+0

ОК, спасибо за ответ. Я забыл упомянуть, что текст, отображаемый элементами меню, был связан с ViewModel, а также с ObberableCollection. Это, безусловно, исключало бы No.2. Я не уверен, что полностью понимаю № 1? Я создаю команду, которая реализует интерфейс ICommand, но как передается текст в команде? Еще раз спасибо –

+0

@jon Я предполагаю, что принятый ответ дал вам понять. – Will

Смежные вопросы