W którym momencie jest sprawdzane CanExecute()?
To jest sprawdzane cały czas w pętli działania programu.
Jaki ma wpływ CommandParameter na wykonywanie komendy i w których momentach i jak to się w ogóle dzieje?
Nie ma żadnego wpływu. Albo przesyłasz do komendy parametr albo nie. Od Ciebie zależy co z tym robisz. Możesz go przekazać i nawet nie obsłużyć wewnątrz viewmodelu. Jeżeli prześlesz coś parametrem to automatycznie w metodach bool CanExecute(object parameter)
i void Execute(object parameter)
argument metody będzie nienullowy. Przekazywanie przez parametr różnych rzeczy jest przydatne w przypadku kiedy nie można zbindować czegoś do własności np. kontrolki PasswordBox
. W tym przypadku najlepiej użyć parametru.
Podajcie mi proszę jakiś przykład zastosowania komend w dużych aplikacjach abym mógł to choć troszkę zrozumieć.
Komendy w dużych aplikacjach działają tak samo jak w małych. Nie ma tutaj specjalnej filozofii. Trzeba natomiast uważać ze sprawdzaniem CanExecute
. Jako, że sprawdzane jest to bez przerwy w pętli działania programu to potrafi czasami zwolnić apkę jeżeli jest źle napisane np:
public ICommand OdSth
{
get
{
return new RelayCommand(() =>
{
// Some code...
} ,()=> this.Check() /* CanExecute checking... */ );
}
}
Jeżeli private bool Check()
iteruje po jakiejś strasznie dużej kolekcji, a jak wiadomo sprawdzane jest to bez przerwy w pętli programu to wiadomo, że zwolni Ci to aplikację. Wtedy wywołanie takiej metody należałoby jakoś zwarunkować, żeby sprawdzanie odbywało się powiedzmy tylko raz, w zależności od czegoś tam ważnego i jeśli to coś ważnego się zmieni to sprawdź kolejny raz.
No i oczywiście bardzo ważna sprawa: długie komendy to złe komendy. Tak samo komendy, które realizują logikę biznesową, która to powinna być realizowana przez klasy serwisowe modelu. Komendy w VM mają po prostu wykonywać metody modelu i wtedy jest to najbardziej czytelne.