Зачем использовать релайомманд или делегатекома, а не просто реализацию ICOMBAND?

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

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

В моем домении эти паттерны обязаны VM нарушать принцип 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>

, и это моя VM:

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
}

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

8
задан David Anderson 14 September 2011 в 00:53
поделиться