MVVM Lightフレームワークの学習を開始したばかりで、RelayCommandの使用方法に関する簡単な例を見つけることができません。学習のために、ビューにボタンをクリックすると、ショーをクリックするとhello world worldメッセージボックスが表示され、偶数分ごとに有効になります(基本的にはDateTime.Now.Minute%2 == 0の場合)。 。
ボタンXAMLはどのように見え、RelayCommand HelloWorldはViewModelでどのように定義されますか?
ご協力いただきありがとうございます!!
RelayCommand
の目的は、Buttonコントロールが必要とするICommand
インターフェイスを実装し、通常は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
をコードビハインドまたは_DataContext={StaticResource ...}
_を介してXAMLに直接設定します。
ボタンは、ViewModelのコマンドに次のようにバインドします
_<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />
_
ボタンがクリックされると、DisplayMessageCommand
を使用し、このオブジェクトでExecute()
を呼び出します。このオブジェクトは、RelayCommand
をDisplayMessage
メソッドに転送するだけです。
DispatchTimer
は1分に1回オフになり、RaiseCanExecuteChanged()
を呼び出します。これにより、コマンドにバインドされているボタンで、コマンドがまだ有効かどうかを再確認できます。それ以外の場合は、ボタンをクリックして、コマンドが現在使用できないことを確認するだけです。
またはラムダと
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;
}
)
);
}
}