Inżynieria

WPF, ComboBox, enum i language

23 marca, 2022 0
Podziel się:

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.

Definicja enuma DeviceConfigurationType

Ryc. 1 Definicja 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.

Definicja właściwości Configurations (fragment klasy MainWindowViewModel)

Ryc. 2 Definicja właściwości Configurations (fragment klasy MainWindowViewModel)

Binding właściwości Configurations (MainWindow.xaml)

Ryc. 3 Binding właściwości Configurations (MainWindow.xaml)

Okno aplikacji ComboBox001

Ryc. 4 Okno aplikacji ComboBox001

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.

Definicja stylu Sii.Wpf.Examples.ComboBox.DeviceConfigurationTypes

Ryc. 5 Definicja stylu Sii.Wpf.Examples.ComboBox.DeviceConfigurationTypes

Pojawiła się tutaj klasa EnumBinding, która dostarcza wartości dla właściwości ItemSource.

Definicja klasy EnumBinding

Ryc. 6 Definicja klasy EnumBinding

Następnie, w widoku MainWindow.xaml określamy styl dla comboboxa.

Przykład użycia stylu Sii.Wpf.Examples.ComboBox.DeviceConfig

Ryc. 7 Przykład użycia stylu Sii.Wpf.Examples.ComboBox.DeviceConfigurationTypes (MainWindow.xaml)

Okno aplikacji ComboBox002

Ryc. 8 Okno aplikacji ComboBox002

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).

Okno aplikacji ComboBox003

Ryc. 9 Okno aplikacji ComboBox003

Jak to osiągnąć? Tutaj z pomocą przychodzą nam wspomniane TypeConverter i DescriptionAttribute. Za ich pomocą trzeba trochę zmodyfikować enuma DeviceConfigurationType jak poniżej.

Definicja enuma DeviceConfigurationType atrybutami Description i konwerterem EnumDescritpionTypeConverter

Ryc. 10 Definicja enuma DeviceConfigurationType atrybutami Description i konwerterem EnumDescritpionTypeConverter

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.

Definicja klasy EnumDescritpionTypeConverter

Ryc. 11 Definicja klasy EnumDescritpionTypeConverter

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

Pliki Language.resx (angielski) i Language.pl-PL.resx

Ryc. 12 Pliki Language.resx (angielski) i Language.pl-PL.resx

Plik Language.resx

Ryc. 13 Plik Language.resx

Plik Language.pl-PL.resx

Ryc. 14 Plik Language.pl-PL.resx

Następnie trzeba znów zmienić definicję enuma DeviceConfigurationType .

Definicja enuma DeviceConfigurationType z atrybutami LocalizedDescription

Ryc. 15 Definicja enuma DeviceConfigurationType z atrybutami LocalizedDescription

Jak widzimy, zamiast DescriptionAttribute używamy LocalizedDescriptionAttribute (która dziedziczy po DescriptionAttribute).

Ryc. 16 Definicja klasy LocalizedDescriptionAttribute

Ryc. 16 Definicja klasy LocalizedDescriptionAttribute

Poniżej przedstawiono aplikację w języku angielskim

Okno aplikacji ComboBox004 (po angielsku)

Ryc. 17 Okno aplikacji ComboBox004 (po angielsku)

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).

Materiały zapowiedziane w artykule

Sii.Wpf.Examples.ComboBox

Kategorie: Inżynieria
Piotr Mrowiec
Autor: Piotr Mrowiec
Posiada ponad 20-letnie doświadczenie w tworzeniu oprogramowania jako C# i SQL Developer. Jego praca polega na tworzeniu dokumentacji technicznej, projektowaniu i rozwijaniu nowych funkcjonalności, testowaniu oprogramowania. Do zespołu Sii dołączył w styczniu 2021 roku.

    Imię i nazwisko (wymagane)

    Adres email (wymagane)

    Temat

    Treść wiadomości

    Zostaw komentarz