Ich möchte eine ComboBox in WPF erstellen, die oben ein null
-Objekt hat. Wenn dies ausgewählt wird, sollte das SelectedItem auf null gesetzt werden (auf den Standardzustand zurücksetzen). Ich habe ewig gesucht, fand aber keine zufriedenstellende Lösung.
Wenn möglich, möchte ich, dass es nur mit XAML-Code oder einem angehängten Verhalten geschieht, weil ich nicht wirklich gerne Dinge im ViewModel für die View ändere oder Standardsteuerelemente überschreibe.
Hier ist, was ich bisher herausgefunden habe (verkürzter Code):
%Vor%
Ich denke, der beste Weg wäre, einen Ereignistrigger hinzuzufügen, der SelectedIndex
auf -1
setzt, wenn der Gegenstand ausgewählt wird, aber hier habe ich mich festgefahren.
Irgendwelche Ideen wie man das macht? Oder ein besserer Weg, wie ein angehängtes Verhalten?
Denken Sie darüber nach, ein Null-Objektmuster für das Combobox-Element "None" zu implementieren und dieses Element zu Ihren Elementen hinzuzufügen Liste. Implementieren Sie dann benutzerdefinierte Logik zum Speichern von Nullobjekt in dieser Klasse oder überprüfen Sie, ob das ausgewählte Element vom Typ NullItem ist.
Ich habe die folgende Lösung für ein ähnliches Problem verwendet. Es verwendet die Converter-Eigenschaft der Bindung, um zwischen der internen Repräsentation (das ist null ein vernünftiger Wert) und dem, was ich in der ComboBox erscheinen möchte, hin und her zu gehen. Ich mag es, dass es keine Notwendigkeit gibt, eine explizite Liste in einem Modell oder Viewmodel hinzuzufügen, aber ich mag die fragile Verbindung zwischen dem String-Literal im Konverter und dem in der ComboBox nicht.
%Vor%und dann sieht der Konverter wie folgt aus:
%Vor%Sie können die Auswahl zurücksetzen, wenn Sie ein Element auswählen.
%Vor% Leider funktioniert das nicht mit ItemsSource
und einer CompositeCollection
um dieses Zurücksetzungselement zu einer beliebigen Liste hinzuzufügen. Der Grund dafür ist, dass WPF das Storyboard.TargetName
in diesem Bereich nicht auflösen kann.
Aber vielleicht hilft dir das, das ComboBox
erneut zu versuchen.
Obwohl ich zustimme, gibt es viele Lösungen für das WPF ComboBox Problem null item , Andrei Zubovs Verweis auf das Null-Objektmuster inspirierte mich zu einer weniger überkauften Alternative, die darin besteht, jedes Quellelement mit einem null -Wert zu umhüllen, bevor das ganze injiziert wird Die Auflistung wurde in die Eigenschaft ComboBox.ItemsSource eingepackt. Das ausgewählte Element ist in der Eigenschaft SelectedWrappedItem verfügbar.
Also, zuerst definieren Sie Ihren generischen Wrapper ...
%Vor%Definieren Sie Ihr Artikelmodell ...
%Vor%Definieren Sie Ihr ViewModel ...
%Vor%Und, Finnely deine Ansicht (ok, es ist ein Fenster)
%Vor%Habe ich an dieser Stelle erwähnt, dass Sie das ausgepackte ausgewählte Element durch die Eigenschaft SelectedWrappedItem.Value abrufen können?
Hier können Sie ein funktionierendes Beispiel erhalten
Ich hoffe, es hilft jemand anderem
Hier ist die ultimative super-einfache Lösung für dieses Problem:
Anstatt ein Element mit einem Wert von Null in Ihrer ItemsSource zu verwenden, verwenden Sie DbNull.Value als Element oder als Werteigenschaft des Elements.
Das ist alles. Sie sind fertig. Keine Wertkonverter, kein Code-Behind, keine XAML-Trigger, keine Wrapper, keine Kontroll-Nachkommen ...
Es funktioniert einfach!
Hier ist ein kurzes Beispiel für bindende enum-Werte einschließlich eines "Null-Elements":
Erstellen Sie Ihre ItemsSource wie folgt:
%Vor%Binden Sie dies an die ItemsSource der ComboBox.
Binden Sie den SelectedValue Ihrer ComboBox an eine Eigenschaft mit einem MyEnum-Typ? (d. h. Nullable & lt; MyEnum & gt;).
Fertig!
Hintergrund: Dieser Ansatz funktioniert, weil DbNull.Value nicht dasselbe wie ein C # -Nullwert ist, während das Framework andererseits eine Anzahl von Zwangsverfahren enthält, um zwischen diesen beiden zu konvertieren. Letztendlich ist dies ähnlich dem erwähnten "Null-Objekt-Muster", aber ohne die Notwendigkeit, ein einzelnes Null-Objekt zu erzeugen und ohne irgendwelche Wert-Konverter zu benötigen.