Связывание команд в XAML против свойств ICommand в ViewModel - PullRequest
11 голосов
/ 05 июля 2011

Я только начинаю использовать командование с MVVM в приложении.Я нашел несколько примеров и попробовал оба способа в своем коде.В некоторых примерах привязка команд в xaml выглядит следующим образом:

<CommandBinding Command="local:MainWindow.OpenRecentFile" 
                Executed="{Binding OpenRecentFile_Executed}" />
...
<MenuItem Header="{x:Static culture:TextResource.RecentFilesMenuItem}" 
          Command="local:MainWindow.RecentFilesCommand" >

С OpenRecentFile_Executed, являющимся методом в ViewModel, и статической ICommand, например, так:

 public static readonly ICommand OpenRecentFile = 
     new RoutedCommand("Open Recent", typeof(MainWindow));

Я также видел, гдев ViewModel есть свойство типа ICommand, которое связано в View следующим образом:

<MenuItem Header="Close Current File" 
          Command="{Binding CloseCurrentFileCommand}" 
          CommandParameter="{TemplateBinding DataContext}"/>

и в ViewModel:

private ICommand closeCurrentFileCommand;
public ICommand CloseCurrentFileCommand
{
    get
    {
        if (closeCurrentFileCommand == null)
        {
            closeCurrentFileCommand = 
                new RelayCommand(param => this.CloseCurrentCedarFile(param));
        }
        return closeCurrentFileCommand;
    }
}

Каковы преимущества /недостатки каждого метода?

Ответы [ 2 ]

8 голосов
/ 05 июля 2011

Это зависит от вашего дизайна. Если вы стремитесь к быстрому подходу - окну с внутренним кодом, то объявление команд в XAML, вероятно, сэкономит вам время и сократит усилия в долгосрочной перспективе.

Если вы собираетесь использовать приложение MVVM, я бы настоятельно рекомендовал привязку к ICommand, поскольку команды в целом - это способы манипулировать вашими данными (открытие / сохранение / редактирование), и это должно быть определено во ViewModel. Возможно, больше усилий зависит от функциональности, но MVVM - отличный способ, если вы работаете с большим приложением.

В конце концов, оба будут работать одинаково, но ваш дизайн и подход имеют значение.

6 голосов
/ 05 июля 2011

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

Реализация ICommand на основе свойств всегда будет работать, поскольку между вызовом команды и ее доставкой нет шага «маршрутизации».

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

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