Зачем использовать RelayCommand или DelegateCommand вместо простой реализации ICommand? - PullRequest
8 голосов
/ 13 сентября 2011

Я только изучаю MVVM в WPF, я совершенно новичок как в WPF, так и в MVVM (я понимаю, как он работает, но никогда не использовал его ...)

Каждый учебник /Статья, которую я нахожу в Интернете, использует либо RelayCommand, либо DelegateCommand.

По моему мнению, эти шаблоны обязывают виртуальную машину нарушать принцип SRP, поскольку она будет содержать внутри себя командную логику.

Почему бы просто не использовать пользовательскую реализацию интерфейса ICommand?Вот так:

Представьте, что вы отображаете человека и сохраняете его в БД:

Мой Xaml будет таким:

<StackPanel>                         
    <TextBlock Width="248" Height="24" Text="The name is:: " />
    <TextBlock Width="248" Height="24" Text="{Binding Name}">            
    </TextBlock>
    <TextBox HorizontalAlignment="Left" Name="textBox1" Width="120" Height="23" 
             VerticalAlignment="Top" Text="{Binding Name}"
             />
    <Button  Name="Salvar" VerticalAlignment="Bottom" 
            Command="{Binding SavePerson}" 
            CommandParameter="{Binding}">Save</Button>
</StackPanel>

И это мойВМ:

public class PersonVM: INotifyPropertyChanged
{
    private string nameValue;

    public string Name
    {
        get{
            return nameValue;
        }
        set
        {
            if (value != this.nameValue)
            {
                this.nameValue= value;
                NotifyPropertyChanged("Name");
            }
        }
    }


    public ICommand SavePerson{ get { return new SavePersonCommand(); } }
    #region INotifyPropertyChanged Members


    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    #endregion
}

И это моя команда:

public class SavePersonCommand: ICommand
{       
    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return (parameter as PersonVM) != null;            
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
            PersonVM person = parameter as PersonVM;
            if(person != null)
                //Actually Save the person...            
    }   


    #endregion
}

В чем проблема с моим подходом?

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Ничего ... но DelegateCommand полезен, если у вас есть действительно конкретная Команда только для вашей ViewModel, и вы не хотите показывать ее другим, потому что она действительно предназначена для вашей ViewModel. Также мне нравятся DelegateCommands, потому что им не нужен другой класс, который вы просто передаете в своей ViewModel, это меньше кода для написания. Ваш подход полезен, если поставляемая ViewModel является базовой ViewModel, которая используется совместно, что также позволяет совместно использовать вашу Команду.

1 голос
/ 13 сентября 2011

Если вы не будете использовать какую-либо базовую команду (фреймворка или вашей собственной команды), вы обнаружите, что снова и снова пишете один и тот же код. Например: вы не вызываете событие CanExecuteChanged в своей собственной команде. То же самое касается реализации INotifyPropertyChanged. Вот почему каждый использует тот или иной фреймворк MVVM.

...