Я только изучаю 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
}
В чем проблема с моим подходом?