2011-01-29 98 views
1

我开始使用MVVM构建Silverlight应用程序。 我有一个XAML页面上的按钮来启用点击数据的保存我已经写了下面的代码。Silverlight MVVM中的多个命令绑定

<Button Content="Save" Grid.Column="2" Grid.Row="3" 
        Command="{Binding Path=SaveCourse}"/> 

在视图模型类中,我实现了下面的代码;

public class SaveCurrentCourse : ICommand 
     { 
      private MaintenanceFormViewModel viewModel; 
      public SaveCurrentCourse(MaintenanceFormViewModel viewModel) 
      { 
       this.viewModel = viewModel; 
       this.viewModel.PropertyChanged += (s, e) => 
        { 
         if (this.CanExecuteChanged != null) 
         { 
          this.CanExecuteChanged(this, new EventArgs()); 
         } 
        }; 
      } 
      public bool CanExecute(object parameter) 
      { 
       return this.viewModel.CurrentCourse != null; 
      } 

      public event EventHandler CanExecuteChanged; 

      public void Execute(object parameter) 
      { 
       this.viewModel.SaveCourseImplementation(); 
      } 
     } 

我的保存命令适用于哪种类型。 我的问题是,如果页面上有多个按钮,那么我是否必须为每个按钮编写与上面相同的代码? 任何机构都可以提供更好的方法吗?

回答

1

微软的模式&实践团队提供了一个名为Prism的库,可以简化这个过程。 http://compositewpf.codeplex.com/

它们提供了一个名为DelegateCommand的类,它实现了ICommand,并允许您传递想要执行的方法名称。

public class Test { 
    public Test(){ 
     SomeCommand = new DelegateCommand<object>(DoSomething); 
    } 
    public DelegateCommand<object> SomeCommand { get; private set;} 
    private void DoSomething(object parameter){ 
     //Do some stuff 
    } 
} 

然后,您可以绑定你的控制命令属性SomeCommand。您还可以将CommandParameter绑定到某个对象,并将其作为参数传递给DoSomething方法。 DelegateCommand的另一个构造函数允许您传递CanExecute方法作为第二个参数,它将启用/禁用该控件。如果您需要更新控件的启用/禁用状态,则可以调用DelegateCommand的RaiseCanExecuteChanged()方法。

public class Test { 
    public Test(){ 
     SomeCommand = new DelegateCommand<object>(DoSomething, (enabled) => CanSave()); 
    } 
    public DelegateCommand<object> SomeCommand { get; private set;} 
    private void DoSomething(object parameter){ 
     //Do some stuff 
    } 
    private bool CanSave(){ 
     if(/*test if the control should be enabled */) 
      return true; 
     else 
      return false; 
    } 
    private void DoABunchOfStuff(){ 
     //something here means the control should be disabled 
     SomeCommand.RaiseCanExecuteChanged(); 
    } 
} 
+0

顺便说一句,所有的代码都来自内存,显然if语句不会编译,但它应该非常接近。 – Adam 2011-01-29 17:19:35