2013-03-13 97 views
2

我想了解MVVM为WPF应用程序为什么视图模型不MVVM

在下面的例子中,我们使用的是从ICommand的继承,那么在我们的视图模型的委托实现ICommand的,我们实例委托并提供相应的实现

我的问题是为什么我们不能让ViewModel实现ICommand?

视图模型:

public class ViewModel : INotifyPropertyChanged 
{ 
    public ViewModel() 
    { 
     InitializeViewModel(); 
    } 

    protected void InitializeViewModel() 
    { 
     DelegateCommand MyCommand = new DelegateCommand<SomeClass>(
      SomeCommand_Execute, SomeCommand_CanExecute);  
    } 

    void SomeCommand_Execute(SomeClass arg) 
    { 
     // Implementation 
    } 

    bool SomeCommand_CanExecute(SomeClass arg) 
    { 
     // Implementation 
    } 
} 

DelegateCommand:

public class DelegateCommand<T> : ICommand 
{ 
    public DelegateCommand(Action<T> execute) : this(execute, null) { } 

    public DelegateCommand(Action<T> execute, Predicate<T> canExecute) : this(execute, canExecute, "") { } 

    public DelegateCommand(Action<T> execute, Predicate<T> canExecute, string label) 
    { 
     _Execute = execute; 
     _CanExecute = canExecute; 
    } 
. 
. 
. 
} 

回答

3

原因是您的视图和您的命令数量之间存在一对多的关系。

对于每个视图,通常都会有一个ViewModel。但是您可能希望为单个视图提供许多命令。如果您要将您的ViewModel用作命令,则必须拥有ViewModel的多个实例。

典型的实现方式是,您的ViewModel将包含您的View所需的所有命令的实例。

0

您可以实现ICommand这样 - 这是实现ICommand一种很常见的方式。也就是说,你仍然需要在ViewModel上创建一个属性MyCommand以绑定它。

3

简短回答:因为您的ViewModel不是命令。

此外,您的ViewModel可以容纳多个命令。

public class ViewModel : INotifyPropertyChanged 
{ 
    public ViewModel() 
    { 
     InitializeViewModel(); 

     OpenCommand = new DelegateCommand<SomeClass>(
      param => { ... }, 
      param => { return true; }); 

     SaveCommand = new DelegateCommand<SomeClass>(
      param => { ... }, 
      param => { return true; }); 

     SaveAsCommand = new DelegateCommand<SomeClass>(
      param => { ... }, 
      param => { return true; }); 
    } 

    public ICommand OpenCommand { get; private set; } 

    public ICommand SaveCommand { get; private set; } 

    public ICommand SaveAsCommand { get; private set; } 
} 

现在,您可以将这些命令绑定到您的视图,因为它们是属性。