8

我只是在 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>

这是我的虚拟机:

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
}

我的方法有什么问题?

4

2 回答 2

3

什么都没有……但是如果您有一个仅适用于您的 ViewModel 的真正特定的命令并且您不想将它公开给其他人,那么 DelegateCommand 很有用,因为它实际上只适用于您的 ViewModel。我也喜欢 DelegateCommands,因为它们不需要您只需在 ViewModel 中传递的另一个类,编写的代码更少。如果您提供的 ViewModel 是一个基本 ViewModel,它是共享的,它也允许共享您的命令,那么您的方法很有用。

于 2011-09-13T13:48:02.843 回答
1

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

于 2011-09-13T13:48:20.633 回答