为什么使用RelayCommand或DelegateCommand而不是仅仅实现ICommand?

我只是在WPF中学习MVVM,我对WPF和MVVM都是全新的(我理解它是如何工作的,但从未使用过它......)

我在网上找到的每一篇教程/文章都使用了RelayCommand或DelegateCommand。

在我的观点中,这些模式强制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
}

我的方法有什么问题?


如果你不使用一些基本的命令(一个框架或你自己的定制命令),你会发现自己一遍又一遍地写相同的代码。 例如:您不会在自己的命令中引发CanExecuteChanged事件。 实施INotifyPropertyChanged 。 这就是为什么每个人都使用一个或另一个MVVM框架。


什么都没有......但是,如果你的ViewModel只有一个真正特定的Command,并且你不想将它公开给其他人,那么DelegateCommand就很有用,因为它只是为你的ViewModel而准备的。 另外我喜欢DelegateCommands,因为它们不需要另一个类,只需传入ViewModel,它就不需要编写代码。 如果您提供的ViewModel是一个共享的基础ViewModel,您的方法很有用,它也允许共享您的Command。

链接地址: http://www.djcxy.com/p/54735.html

上一篇: Why use a RelayCommand or DelegateCommand instead of just implementing ICommand?

下一篇: Python