Цель
RelayCommand
состоит в том, чтобы реализовать интерфейс ICommand
, который нужен элементам управления Button, и просто передавать вызовы какой-либо другой функции, которая обычно находится рядом с ними в 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
, установленный либо в коде позади, либо в XAML напрямую через DataContext={StaticResource ...}
Ваша кнопка будет затем привязываться к команде в ViewModel, например:
<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />
При нажатии кнопки она использует DisplayMessageCommand
и вызывает Execute()
для этого объекта, который RelayCommand
просто перенаправляет наDisplayMessage
метод.
DispatchTimer
гаснет один раз в минуту и вызывает RaiseCanExecuteChanged()
.Это позволяет кнопке, связанной с командой, перепроверить, действительна ли команда или нет.В противном случае вы можете нажать кнопку только для того, чтобы узнать, что команда в данный момент недоступна.