2011-07-19 9 views
19

MVVM Lightフレームワークの学習を開始したばかりで、RelayCommandの使用方法に関する簡単な例は見つかりません。学習の目的のために、私はちょうどショーをクリックしたときに世界のメッセージボックスをクリックし、毎分(通常はDateTime.Now.Minute%2 == 0の場合)に有効になるボタンを私のビューに持っていたいと思います。 。RelayCommandをMVVM Lightフレームワークで使用する方法

ボタンXAMLの外観と、RelayCommand HelloWorldをViewModelでどのように定義すればよいでしょうか?

ありがとうございます!

答えて

39

RelayCommandの目的は、ボタンコントロールが必要とするインターフェイスを実装し、ViewModelのすぐ隣にある一般的な機能にコールを渡すことです。

だから例えば、あなたのようなのViewModelクラスを持っているでしょう:あなたのコントロールで

class HelloWorldViewModel : ViewModelBase 
{ 
    public RelayCommand DisplayMessageCommand { get; private set; } 

    private DispatchTimer _timer; 

    public HelloWorldViewModel() 
    { 
     this.DisplayMessageCommand = new RelayCommand(this.DisplayMessage, CanDisplayMessage); 

     // Create a timer to go off once a minute to call RaiseCanExecuteChanged 
     _timer = new DispatchTimer(); 
     _timer = dispatcherTimer.Tick += OnTimerTick; 
     _timer.Interval = new Timespan(0, 1, 0); 
     _timer.Start(); 
    } 

    private void OnTimerTick(object sender, EventArgs e) 
    { 
     this.DisplayMessageCommand.RaiseCanExecuteChanged(); 
    } 

    public bool CanDisplayMessage() 
    { 
     return DateTime.Now.Minute % 2 == 0; 
    } 

    public void DisplayMessage() 
    { 
     //TODO: Do code here to display your message to the user 
    } 
} 

を、あなたはどちらかDataContext={StaticResource ...}

あなたを通して直接XAMLの背後にあるかのコードでDataContextセットを持っているでしょうボタンは、ViewModelのコマンドにバインドします。

<Button Content='Push me' Command='{Binding DisplayMessageCommand}' /> 

ボタンをクリックすると、DisplayMessageCommandこのオブジェクトのExecute()を呼び出します。RelayCommandは、DisplayMessageメソッドに転送します。

DispatchTimerは1分に1回オフになり、RaiseCanExecuteChanged()を呼び出します。これにより、コマンドにバインドされているボタンがコマンドがまだ有効かどうかを再確認することができます。それ以外の場合は、ボタンをクリックしてコマンドが現在使用できないことを確認します。

+0

グレートと!それをクリアしてくれてありがとう! – Evan

+0

ちょうど好奇心から、コマンドのCanDisplayMessage()をIsEnabledプロパティにバインドする方法はありますか? – Evan

+0

@evan、ボタンのIsEnabledプロパティを意味する場合は?これは、ボタンのCommandオブジェクトを設定すると自動的に行われます。 – MerickOWA

5

またはラムダ

private RelayCommand<anyobject> _AddCmd; 
    public ICommand AddPoint 
    { 
     get 
     { 
      return _AddCmd ?? 
       (
       _AddCmd = new RelayCommand 
        (
         (obj) => 
         { 
          ViewModelWF.ZeroPoints.Add(new WM.Point(0, 0)); 
         } 
        ) 
       ); 
     } 
    } 

    private RelayCommand _DeleteCmd; 
    public ICommand DeletePoint 
    { 
     get 
     { 
      return _DeleteCmd ?? 
       (
       _DeleteCmd = new RelayCommand 
        (
         () => 
         { 
          int idx = wpfZeroPoints.SelectedIndex; 
         }, 
         () => 
         { 
          return wpfZeroPoints.SelectedIndex <= 0; 
         } 
        ) 
       ); 
     } 
    } 
関連する問題