我刚学习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
}
我的方法有什么问题?
答案 0 :(得分:3)
没什么......但如果你的ViewModel有一个非常具体的Command,并且你不想将它暴露给其他人,那么DelegateCommand非常有用,因为它实际上仅适用于你的ViewModel。我也喜欢DelegateCommands,因为它们不需要你在ViewModel中传递的另一个类,所以编写的代码较少。如果您提供的ViewModel是一个基本的ViewModel,您的方法很有用,它可以共享您的命令。
答案 1 :(得分:1)
如果您不使用某些基本命令(框架或您自己的自定义命令),您会发现自己一遍又一遍地编写相同的代码。例如:您不会在自己的命令中引发CanExecuteChanged
事件。实施INotifyPropertyChanged
同样如此。这就是为什么每个人都在使用一个或另一个MVVM框架。