WPF: ComboBox mit Zurücksetzungselement

9

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?

    
Staeff 15.04.2013, 07:16
quelle

8 Antworten

7

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.

    
Andrei Zubov 15.04.2013 08:21
quelle
3

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%     
dtm 15.11.2013 23:33
quelle
2

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.

    
LPL 15.04.2013 09:19
quelle
1

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

    
Julio Nobre 21.12.2016 23:04
quelle
1

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.

    
softworkz 25.05.2017 01:29
quelle
0

Entfernen Sie die folgende Zeile und fügen Sie eine CheckBox hinzu, dann können Sie Ihre benutzerdefinierte Operation ausführen.

%Vor%     
Ramesh 15.04.2013 07:35
quelle
0

Immer noch nicht 100% zufrieden mit dieser Lösung, aber das Beste, was ich bisher gefunden habe, ist, dass Sie nur den ComboBox-Stil außer Kraft setzen und ein AttachedBehaviour anwenden müssen.

%Vor%

Quelle: Ссылка

    
Staeff 16.04.2013 07:58
quelle
-1

Bitte verwenden Sie den folgenden Code.

%Vor%

Fangen Sie im Ansichtsmodell die Änderungsbenachrichtigung "ClearSelectedItems" ab und löschen Sie SelectedItems von ItemsControl.

    
Ramesh 15.04.2013 08:24
quelle

Tags und Links