Unten ist ein vereinfachtes Beispiel für eine Klasse, die ich habe:
%Vor%Ich habe auch eine Enum, die die IDs von DriverType auf aussagekräftige Namen abbildet:
%Vor%Aber ich möchte dies in XAML an eine Combobox binden. Wegen der Typabweichung stimmt das leider nicht. Also muss ich in meinem ViewModel eine zweite Eigenschaft erstellen, um die zwei
zuzuordnen %Vor%Dann binde ich an die neue Eigenschaft.
%Vor%Nun, das funktioniert, aber fühlt sich sehr eklig an. Es verwendet SelectedDriverType als Konverter. Ich möchte vermeiden, dass die Eigenschaft des DTO einen anderen Typ hat. Gibt es andere, elegantere Lösungen?
Danke!
Sie können einen generischen Konverter sagen EnumConverter
, der convert int to Enum
hat, um ihn auf XAML anzuzeigen, und convert back from Enum to int
, um ihn in Ihrer ViewModel-Klasse zu setzen.
Es funktioniert für jeden Enum-Typ. Sie müssen nur den Enumerationstyp in den Konverterparametern übergeben.
%Vor%XAML-Verwendung:
%Vor% local
ist der Namespace, in dem Ihr DriverType deklariert ist.
Die akzeptierte Antwort erfordert, dass Sie den Enum-Typ als Konverterparameter für jede Bindung angeben.
Wenn Sie an eine enum-Eigenschaft gebunden sind, kann der Konverter den Enum-Typ aus der Eigenschaft targetType
bestimmen, die ergonomischer und weniger fehleranfällig sein kann.
Dies funktioniert auch unabhängig vom zugrunde liegenden Enum-Typ ( int
, short
, byte
...).
Wenn dieser Konverter aufgerufen wird, wird der Wert des Werts zwischen dem Wert von int / enum basierend auf den Werten value
und targetType
umgedreht. Es gibt keine fest codierten Aufzählungstypen in der Quelle, daher ist es ziemlich wiederverwendbar.
Tags und Links wpf c# data-binding xaml