Ответ 1
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()
. Это позволяет кнопке, которая привязана к команде для повторной проверки того, что команда все еще действительна или нет. В противном случае вы можете нажать кнопку только, чтобы узнать, что команда в настоящее время недоступна.