Wyślij zapytanie Dołącz do Sii

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

Ocena:
Autor
Avatar
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.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany.

Może Cię również zainteresować

Pokaż więcej postów

Bądź na bieżąco

Zapisz się do naszego newslettera i otrzymuj najświeższe informacje ze świata Sii.

Otrzymaj ofertę

Jeśli chcesz dowiedzieć się więcej na temat oferty Sii, skontaktuj się z nami.

Wyślij zapytanie Wyślij zapytanie

Natalia Competency Center Director

Get an offer

Dołącz do Sii

Znajdź idealną pracę – zapoznaj się z naszą ofertą rekrutacyjną i aplikuj.

APLIKUJ APLIKUJ

Paweł Process Owner

Join Sii

ZATWIERDŹ

This content is available only in one language version.
You will be redirected to home page.

Are you sure you want to leave this page?