Ich habe eine Aufzählung wie diese:
public enum MyLovelyEnum
{
FirstSelection,
TheOtherSelection,
YetAnotherOne
};
Ich habe eine Eigenschaft in meinem DataContext:
public MyLovelyEnum VeryLovelyEnum { get; set; }
Und ich habe drei RadioButtons in meinem WPF-Client.
<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>
Wie binde ich nun die RadioButtons für eine ordnungsgemäße bidirektionale Bindung an die Eigenschaft?
Antworten:
Sie könnten einen allgemeineren Konverter verwenden
Und im XAML-Teil verwenden Sie:
quelle
Sie können die akzeptierte Antwort weiter vereinfachen. Anstatt die Aufzählungen in xaml als Zeichenfolgen einzugeben und mehr Arbeit in Ihrem Konverter als nötig zu erledigen, können Sie den Aufzählungswert anstelle einer Zeichenfolgendarstellung explizit übergeben. Wie CrimsonX kommentierte, werden Fehler eher zur Kompilierungszeit als zur Laufzeit ausgegeben:
ConverterParameter = {x: Statisch lokal: YourEnumType.Enum1}
Dann vereinfachen Sie den Konverter:
Bearbeiten (16. Dezember 10):
Vielen Dank an anon für den Vorschlag, Binding.DoNothing anstelle von DependencyProperty.UnsetValue zurückzugeben.Hinweis - Mehrere Gruppen von RadioButtons in demselben Container (17. Februar 11):
Wenn in xaml Optionsfelder denselben übergeordneten Container verwenden, werden durch Auswahl eines Optionsfelds alle anderen in diesem Container deaktiviert (auch wenn sie an eine andere Eigenschaft gebunden sind). Versuchen Sie also, Ihre RadioButton-Dateien, die an eine gemeinsame Eigenschaft gebunden sind, wie ein Stapelfenster in einem eigenen Container zusammenzufassen. In Fällen, in denen Ihre zugehörigen RadioButtons keinen einzelnen übergeordneten Container gemeinsam nutzen können, setzen Sie die GroupName-Eigenschaft jedes RadioButton auf einen gemeinsamen Wert, um sie logisch zu gruppieren.Bearbeiten (5. April 11):
Vereinfachtes ConvertBack-If-else zur Verwendung eines ternären Operators.Hinweis - Aufzählungstyp in einer Klasse verschachtelt (28. April 11):
Wenn Ihr Aufzählungstyp in einer Klasse verschachtelt ist (und nicht direkt im Namespace), können Sie möglicherweise die Syntax '+' verwenden, um auf die Aufzählung in XAML zuzugreifen, wie in einer (nicht markierten) Antwort auf die Frage Nicht gefunden angegeben Aufzählungstyp für statische Referenz in WPF :ConverterParameter = {x: Statisch lokal: YourClass + YourNestedEnumType.Enum1}
Aufgrund dieses Microsoft Connect- Problems lädt der Designer in VS2010 jedoch keine Angabe mehr
"Type 'local:YourClass+YourNestedEnumType' was not found."
, sondern das Projekt wird erfolgreich kompiliert und ausgeführt. Natürlich können Sie dieses Problem vermeiden, wenn Sie Ihren Aufzählungstyp direkt in den Namespace verschieben können.Bearbeiten (27. Januar 12):
Wenn Enum-Flags verwendet werden, lautet der Konverter wie folgt:Bearbeiten (7. Mai 15):
Denken Sie im Fall einer nullfähigen Aufzählung (die in der Frage nicht gestellt wird, aber in einigen Fällen erforderlich sein kann, z. B. ORM, das null aus der Datenbank zurückgibt, oder wann immer es sinnvoll ist, dass der Wert in der Programmlogik nicht angegeben wird), daran, ihn hinzuzufügen eine anfängliche Nullprüfung in der Konvertierungsmethode und Rückgabe des entsprechenden Bool-Werts, der normalerweise falsch ist (wenn Sie kein Optionsfeld auswählen möchten), wie unten:Hinweis - NullReferenceException (10. Oktober 18):
Das Beispiel wurde aktualisiert, um die Möglichkeit des Auslösens einer NullReferenceException zu entfernen.IsChecked
ist ein nullbarer Typ, daherNullable<Boolean>
scheint die Rückgabe eine vernünftige Lösung zu sein.quelle
Für die Antwort von EnumToBooleanConverter: Anstatt DependencyProperty.UnsetValue zurückzugeben, sollten Sie Binding.DoNothing für den Fall zurückgeben, dass der Wert des Optionsfelds IsChecked falsch wird. Ersteres weist auf ein Problem hin (und zeigt dem Benutzer möglicherweise ein rotes Rechteck oder ähnliche Validierungsindikatoren an), während letzteres lediglich darauf hinweist, dass nichts getan werden sollte, was in diesem Fall gewünscht wird.
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx
quelle
Ich würde die RadioButtons in einer ListBox verwenden und dann an den SelectedValue binden.
Dies ist ein älterer Thread zu diesem Thema, aber die Grundidee sollte dieselbe sein: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/
quelle
Für UWP ist es nicht so einfach: Sie müssen durch einen zusätzlichen Rahmen springen, um einen Feldwert als Parameter zu übergeben.
Beispiel 1
Gültig für WPF und UWP.
Beispiel 2
Gültig für WPF und UWP.
Beispiel 3
Gültig nur für WPF!
UWP unterstützt dies nicht,
x:Static
daher kommt Beispiel 3 nicht in Frage. Angenommen, Sie gehen mit Beispiel 1 , ist das Ergebnis ausführlicherer Code. Beispiel 2 ist etwas besser, aber immer noch nicht ideal.Lösung
Definieren Sie dann für jeden Typ, den Sie unterstützen möchten, einen Konverter, der den Aufzählungstyp enthält.
Der Grund, warum es eingerahmt werden muss, ist, dass es anscheinend keine Möglichkeit gibt, auf den Typ in der
ConvertBack
Methode zu verweisen . Dafür sorgt das Boxen. Wenn Sie sich für eines der beiden ersten Beispiele entscheiden, können Sie einfach auf den Parametertyp verweisen, sodass Sie nicht mehr von einer Box-Klasse erben müssen. Wenn Sie alles in einer Zeile und mit möglichst geringer Ausführlichkeit erledigen möchten, ist die letztere Lösung ideal.Die Verwendung ähnelt Beispiel 2 , ist jedoch weniger ausführlich.
Der Nachteil ist, dass Sie für jeden Typ, den Sie unterstützen möchten, einen Konverter definieren müssen.
quelle
Ich habe eine neue Klasse erstellt, um RadioButtons und CheckBoxes an Aufzählungen zu binden. Es funktioniert für markierte Aufzählungen (mit mehreren Kontrollkästchen) und nicht markierte Aufzählungen für Kontrollkästchen oder Optionsfelder mit einfacher Auswahl. Es werden auch überhaupt keine ValueConverter benötigt.
Dies mag zunächst komplizierter aussehen. Sobald Sie diese Klasse in Ihr Projekt kopiert haben, ist dies erledigt. Es ist generisch, so dass es leicht für jede Aufzählung wiederverwendet werden kann.
Nehmen wir an, Sie haben eine Aufzählung zum manuellen oder automatischen Ausführen einer Aufgabe, die für jeden Wochentag geplant werden kann, sowie einige optionale Optionen ...
So einfach ist es, diese Klasse zu verwenden:
Und so einfach ist es, Kontrollkästchen und Optionsfelder mit dieser Klasse zu verknüpfen:
quelle
EnumSelection<StartTask>
Objekt. Wenn Sie sich die Definition vonEnumSelection<T>
ansehen, können Sie sehen, dass sie eine Value-Eigenschaft hat. Das Ansichtsmodell muss also keine "SelectedStartTask" haben. Sie würden verwendenStartUp.Value
. Wenn Sie den Standardwert "Undefiniert" haben, lesen Sie die dritte Aufzählung "AdditionalOptions". Sie enthält "None" anstelle von "Undefined". Sie können den Namen jedoch nach Belieben ändern.Dies funktioniert auch für Checkbox .
Binden einer einzelnen Aufzählung an mehrere Kontrollkästchen.
quelle
Basierend auf dem EnumToBooleanConverter von Scott. Ich habe festgestellt, dass die ConvertBack-Methode in der Enum mit Flags-Code nicht funktioniert.
Ich habe den folgenden Code ausprobiert:
Das einzige, was ich nicht zur Arbeit bringen kann, ist, eine Besetzung von
int
bis zu machen,targetType
also habe ich es fest codiertNavigationProjectDates
, die Aufzählung, die ich benutze. UndtargetType == NavigationProjectDates
...Für allgemeinere Flags Enum-Konverter bearbeiten:
quelle
Sie können die Optionsfelder dynamisch erstellen
ListBox
und dabei ganz einfach ohne Konverter helfen.Die folgenden Schritte zum Erstellen sind: Erstellen Sie eine ListBox, legen Sie die ItemsSource für das Listbox als Aufzählung fest
MyLovelyEnum
und binden Sie das SelectedItem der ListBox an dieVeryLovelyEnum
Eigenschaft. Anschließend werden die Optionsfelder für jedes ListBoxItem erstellt.Control Template
füllen Sie jedes Element als Optionsfeld ausDer Vorteil ist unten: Wenn sich Ihre Enum-Klasse eines Tages ändert, müssen Sie die GUI (XAML-Datei) nicht aktualisieren.
Referenzen: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/
quelle