Wzbogacanie kontrolek WPF #1


WPF w połączeniu z MVVM to wspaniała sprawa. Co natomiast zrobić, jak interfejs WPF nie daje tego, co daje interfejs WinForms? W tym poście opisuję wzbogacanie kontrolek WPF.

Przykładowa aplikacja w technologii WPF + MVVM

Rozważmy następującą aplikację WPF + MVVM wykorzystującą MVVM Light Toolkit.

Chcemy, aby kontrolka Listbox automatycznie zawsze pokazywała ostatnio dodany element. Załóżmy, że wyświetlamy logi i chcemy widzieć zawsze najnowsze. Jak to zrobić?

W WinForms jest to trywialne zadanie, ale w WPF niekoniecznie. Interfejs XAML nie zawiera takiej opcji. Możemy napisać ten kawałek logiki prezentacji w code behind. Problemem jest to, że im więcej umieszczamy w code behind, tym bardziej odchodzimy od MVVM w stronę klasycznej WinForms. A my chcemy WPF + MVVM zamiast WinForms.

Rozszerzenie możliwości kontrolki ListBox

Poniżej prezentuję, jak napisać rozszerzenie do WPF. Pozwala nam to dodać do kontrolek właściwości, jakich one domyślnie nie posiadają.

Omówmy to, co widzimy na listingu powyżej:

  • L.9 definiujemy klasę dziedziczącą po DependencyObject.
  • L.11-15 określamy nazwę nowej właściwości, jej typ, typ, do jakiego obiektu możemy go podpiąć oraz metodę, jaka zostanie wywołana, gdy wartość zostanie zmieniona.
  • L.49-57 getter oraz setter dla naszej nowej właściwości. Oczywiście wszystko są to metody statyczne.
  • L30-47 metoda, która wykona się, gdy nasza właściwość ulegnie zmianie. Sprawdzamy obiekt macierzysty, czy jest typu ListBox i jeśli tak, to dla kolekcji danych rejestrujemy funkcję obsługi zdarzenia zmiany w kolekcji. Ponieważ sama funkcja obsługi nie będzie miała dostępu do obiektu listy, a jedynie do skojarzonych z nią danych, to trzymamy w słowniku mapowanie.

Wzbogacanie kontrolek WPF

One thought on “Wzbogacanie kontrolek WPF #1

Dodaj komentarz

Twój adres email nie zostanie opublikowany.