Rozpoczynając pracę z aplikacjami WPF, jeden z problemów stanowiło załadowanie do kontrolek combobox danych typu enum. Szczególnie, jak zrobić to w języku odpowiednim dla użytkownika. W poniższym artykule przedstawiam sposób, aby osiągnąć ten cel.
Wszystkie przykłady są zawarte w solucji Sii.Wpf.Examples, która jest dołączona do artykułu*. Poniższe przykłady będą używały enuma DeviceConfigurationType.
ViewModel i ObservableCollection
W najprostszym przypadku w viewmodelu można zdefiniować kolekcję, którą będziemy podpinać do kontrolki combobox. Na poniższej grafice mamy właściwość Configurations typu ObservableCollection<DeviceConfigurationType>, do której dodajemy poszczególne wartości enuma.
Powyższy przykład jest zawarty w projekcie Sii.Wpf.Examples.ComboBox001.*
Style
Bardziej eleganckim podejściem jest zdefiniowanie stylu do comboboxa, w którym ładujemy wartości enuma.
Pojawiła się tutaj klasa EnumBinding, która dostarcza wartości dla właściwości ItemSource.
Następnie, w widoku MainWindow.xaml określamy styl dla comboboxa.
Powyższy przykład jest zawarty w projekcie Sii.Wpf.Examples.ComboBox002.*
TypeConverter i DescriptionAttribute
Jak widać na powyższym zrzucie działającej aplikacji, w comboboxie mamy kolejne wartości emuna. Lepszym rozwiązaniem będą bardziej opisowe wartości (jak poniżej).
Jak to osiągnąć? Tutaj z pomocą przychodzą nam wspomniane TypeConverter i DescriptionAttribute. Za ich pomocą trzeba trochę zmodyfikować enuma DeviceConfigurationType jak poniżej.
Klasą DescriptionAttribute nie będziemy się zajmować (jest zdefiniowana w namespace System.ComponentModel). Ciekawsza jest klasa EnumDescritpionTypeConverter, której źródła są przedstawione poniżej.
Powyższy przykład jest zawarty w projekcie Sii.Wpf.Examples.ComboBox003.*
Multilanguage
Niestety, stosując atrybut DescriptionAttribute, jesteśmy w tym wypadku skazani tylko na język polski, a aplikacje WPF mogą być wielojęzyczne. Jak to osiągnąć? Dodajemy do projektu pliki typu resources (.resx) dla każdego języka. Tutaj Language.resx (angielski) i Language.pl-PL.resx
Następnie trzeba znów zmienić definicję enuma DeviceConfigurationType .
Jak widzimy, zamiast DescriptionAttribute używamy LocalizedDescriptionAttribute (która dziedziczy po DescriptionAttribute).
Poniżej przedstawiono aplikację w języku angielskim
Powyższy przykład jest zawarty w projekcie Sii.Wpf.Examples.ComboBox004.*
Podsumowanie
Myślę, że powyższe przykłady pomogą początkującym developerom w rozwiązaniu kilku problemów w WPF i wskażą, jak można rozwiązywać inne zagadnienia.
Wszystkie przykłady zawarte są w solucji Sii.Wpf.Examples (Visual studio 2022, Net. 5.0).
Zostaw komentarz