Jak używać RelayCommand z frameworkiem MVVM Light
Właśnie zacząłem uczyć się frameworka MVVM Light i nie mogę znaleźć żadnych prostych przykładów, jak używać polecenia RelayCommand. Dla celów nauki, chciałbym tylko mieć przycisk w moim widoku, który po kliknięciu Pokaż okno wiadomości hello world world, i który jest włączony w każdej parzystej minucie (w zasadzie Jeśli DateTime.Teraz.Minuta % 2 == 0).
Jak wyglądałby przycisk XAML i jak definiowałby Relaycommand HelloWorld w modelu widoku?
Thanks for your pomocy!!
2 answers
RelayCommand
'celem s jest zaimplementowanie interfejsu ICommand
potrzebnego do sterowania przyciskami i po prostu przekazanie wywołań do innej funkcji, która zazwyczaj znajduje się tuż obok nich w ViewModel.
Więc na przykład, masz klasę ViewModel jak:
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
}
}
Pod twoją kontrolą będziesz miał DataContext
ustawiony albo w kodzie za, albo w XAML bezpośrednio przez DataContext={StaticResource ...}
Twój przycisk połączy się z poleceniem w ViewModel, jak więc
<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />
Po kliknięciu przycisku, używa on DisplayMessageCommand
i wywołuje Execute()
na tym obiekcie, który RelayCommand
przechodzi do metody DisplayMessage
.
DispatchTimer
wyłącza się raz na minutę i dzwoni RaiseCanExecuteChanged()
. Pozwala to przyciskowi powiązanemu z poleceniem ponownie sprawdzić, czy polecenie jest nadal ważne, czy nie. W przeciwnym razie możesz kliknąć przycisk tylko, aby dowiedzieć się, że polecenie nie jest obecnie dostępne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 03:05:53
Lub z lambda
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;
}
)
);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 12:16:31