2011-01-29 120 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