DelegateCommands w Prismie są to obiekty, które implementują interfejs ICommand, służą one do interakcji widoku z ViewModelem. Korzystając z Prisma nie musimy już pisać własnej klasy implementującej ten interfejs (tak jak to zrobiliśmy tutaj). Konstruktor klasy DelegateCommand przyjmuje dwa parametry:
- Action execteMethod - funkcja odpalania przy wywołaniu komendy,
- Func<bool> canExecuteMethod - funkcja sprawdzająca czy daną komendę można wywołać
DelegateCommands z Prisma używamy w taki sam sposób w jaki używaliśmy komend w tym poście.
2. CompositeCommands
CompositeCommands są to obiekty, które przechowują kolekcją obiektów typu DelegateCommand. Tworzenie CompositeCommand jest bardzo proste.
Po pierwsze musimy stworzyć obiekt typu CompositeCommand
public CompositeCommand SomeCompositeCommand = new CompositeCommand();
następnie rejestrujemy w tym obiekcie obiekt implementujący interfejs ICommand, czyli w naszym przypadku jakiś obiekt typu DelegateCommand. Robimy to w następujący sposób:
DelegateCommand DistributeCommand = new DelegateCommand(DistributeCards);
SomeCompositeCommand .RegisterCommand(DistributeCommand);
w razie potrzeby możemy usunąć komendę z kolekcji komend przy pomocy następującej składni:
SomeCompositeCommand .UnregisterCommand(DistributeCommand);
Mając już stworzony obiekt typu CompositeCommand oraz zarejestrowane w nim obiekty DelegateCommand możemy zastosować bindowanie.
Od teraz, w chwili naciśnięcia przycisku, najpierw sprawdzane jest czy dana CompositeCommand może zostać wykonana. CompositeCommand może zostać wykonana tylko wtedy, gdy wszystkie komendy do niej podpięte mogą zostać wykonane. Jeżeli warunek ten zostanie spełniony następuje wywoływanie po kolei wszystkich metod execute z komend podpiętych do danej CompositCommand. CompositeCommand znajduje zastosowanie w przypadku gdy pozwalamy użytkownikowi na edycję wielu elementów jednocześnie i potrzebujemy w prosty sposób przeprowadzić walidację na poszczególnych widokach.
CompositeCommand może również wykorzystana np. do zapisania tylko aktywnego widoku. Dzięki temu, że DelegateCommand implementuje interfejs IActiveAware, CompositeCommand wie, który widok jest aktualnie zaznaczony i zapisze tylko wybrany widok.
Interfejs IActiveAware wygląda w następujący sposób
public interface IActiveAware
{
bool IsActive { get; set; }
event EventHandler IsActiveChanged;
}
- bool IsActive - wskazuje czy dana komenda jest aktualnie aktywna
- event EventHandler IsActiveChanged - informuje o zmianie aktywności komendy
W celu wykorzystania tego interfejsu przez CompositeCommand należy skorzystać z drugiego dostępnego konstruktora tej klasy
CompositeCommand SomeCompositeCommand = new CompositeCommand(true);
Od teraz po naciśnięciu przycisku zbindowanego do tej komendy, wywołana zostanie jedynie aktywna komenda - czyli taka, której właściwość IsActive została ustawiona na true. Niestety o ustawianie aktywności danej komendy musimy zadbać sami.
0 komentarze:
Prześlij komentarz