Зачем использовать RelayCommand или DelegateCommand вместо простой реализации ICommand?
Я только изучаю 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 ответа
Если вы не будете использовать какую-либо базовую команду (фреймворка или вашей собственной пользовательской команды), вы будете снова и снова писать один и тот же код. Например: вы не поднимаете CanExecuteChanged
событие в вашей собственной команде. То же самое касается реализации INotifyPropertyChanged
, Вот почему каждый использует тот или иной фреймворк MVVM.
Ничего... но DelegateCommand полезен, если у вас есть действительно конкретная Команда только для вашей ViewModel, и вы не хотите показывать ее другим, потому что она действительно предназначена для вашей ViewModel. Также мне нравятся DelegateCommands, потому что им не нужен другой класс, который вы просто передаете в своей ViewModel, это меньше кода для написания. Ваш подход полезен, если поставляемая вами ViewModel является базовой ViewModel, которая используется совместно, что также позволяет делиться вашей Командой.