Kann eine WPF ComboBox alternativen Text anzeigen, wenn die Auswahl null ist?

8

Guten Tag!

Ich möchte, dass mein WPF ComboBox alternativen Text anzeigt, wenn die datengebundene Auswahl null ist.

Das Ansichtsmodell hat die erwarteten Eigenschaften:

%Vor%

Die Ansicht hat eine XAML-Bindung an das Ansichtsmodell in der erwarteten Weise:

%Vor%

Das ComboBoxItem , das oben eingekeilt ist, ist eine Möglichkeit, einen zusätzlichen Gegenstand oben zu bekommen. Es ist pures Chrom: Das View-Modell bleibt rein und einfach. Es gibt nur ein Problem: Die Benutzer wollen "Wählen Sie ein Ding" angezeigt, wenn die ComboBox 'Auswahl Null ist.

Die Benutzer wollen nicht wollen, dass ein Ding standardmäßig ausgewählt wird. Sie möchten eine Nachricht sehen, in der sie aufgefordert werden, ein Ding zu wählen.

Ich möchte vermeiden, das Viewmodel mit einer Klasse ThingoWrapper verschmutzen zu müssen, mit einer Methode ToString , die "Select a thingo" zurückgibt, wenn die Eigenschaft .ActualThingo null ist und jede Thingo umhüllt co_de%, und herauszufinden, wie verhindert werden kann, dass der Benutzer den nullierten Thingos auswählt.

Gibt es eine Möglichkeit, "Wähle ein Dingo" innerhalb der Grenzen von Thingo anzuzeigen, indem reines XAML oder reines XAML und einige Codezeilen in der Code-Behind-Klasse der Ansicht verwendet werden?

    
Garth Kidd 25.05.2010, 02:04
quelle

7 Antworten

3

Der Pfad des geringsten Widerstandes, den ich gefunden habe, ist das Null-Objekt-Muster . Ein Anwendungsbeispiel Denken Sie bei diesem Muster in .NET Framework an den statischen Wert Double.NaN, wenn Sie ein Null-Objekt für Ihr Thingo erstellen, können Sie es in Ihrem Ansichtsmodell an die Vorderseite Ihrer Liste anhängen, um anzuzeigen, dass nichts ausgewählt ist. Erstellen Sie eine DataTemplate für die Thingo-Klasse, die über einen DataTrigger für die Null Object-Instanz verfügt, die "Select a Value" anzeigt.

Ich könnte ein Codebeispiel geben, aber es ist vorbei an meiner Schlafenszeit.

    
Michael Brown 25.05.2010, 04:40
quelle
8

Wie streng ist Ihre MVVM-Anforderung? Kannst du ein wenig Code-Behind in der Ansicht haben?

Vielleicht könnten Sie die ComboBox in einem Gitter enthalten, etwa so:

%Vor%

Fügen Sie dann im Code-Behind einige Logik in einen Event-Handler ein:

%Vor%

Wenn Sie IsHitTestVisible="False" DependencyProperty auf den TextBlock setzen, können Mausereignisse durchgelassen werden, so dass Sie auf das Kombinationsfeld klicken können. Wenn Sie die Sichtbarkeit auf Hidden im CodeBehind festlegen, wird das Aussehen der Standard-ComboBox nicht verändert Der Eingabeaufforderungstext ist ausgeblendet.

    
Rob Perkins 29.06.2010 06:37
quelle
4

Sie können keinen Steuervorlagen-Trigger verwenden, aber Sie könnten eine einfache Elementvorlage für die Combobox einrichten:

%Vor%     
Steve Greatrex 25.05.2010 15:42
quelle
3

Bearbeiten: Sieht so aus, als wäre die Auslöseridee ein Nein. Ich habe die Kontrollschablone eines Test-Kombinationsfelds ohne Erfolg hinzugefügt:

%Vor%

Darüber hinaus, wenn ich versuche, die Kontrollschablone in Blend (Edit Current) zu bearbeiten, bleibt mir eine merkmalslose Combobox, keine Farben, nur eine hässliche Schaltfläche (aber es gibt ein randloses Dropdown). Versuchen Sie jemand anderen Vorschlag (Mike Brown vielleicht).

Original:

Sie können einen Trigger in der Kontrollschablone verwenden. Hier ist ein Beispiel, das eine ListBox aus einer App verwendet, an der ich gerade arbeite.

%Vor%

Das obige ControlTemplate hat einen Trigger, der die Eigenschaft HasItems überprüft. Wenn Falsch ist, wird ein Textblock "No Items" in der Mitte der ListBox angezeigt. Wenn es Elemente gibt, werden diese angezeigt.

Ändern Sie in Ihrem Fall den Trigger, um zu überprüfen, ob ItemSelected x: Null ist und setzen Sie die Eigenschaft Text auf "Nothing Selected".

    
CodeWarrior 25.05.2010 02:34
quelle
1

Ich weiß, das ist ein alter Thread, aber hier ist, wie ich es tue. Nachdem ich die Thingos-Sammlung abgeholt habe, füge ich einfach einen neuen Thingo mit einem gefälschten ID-Wert und einem Anzeigewert von "Wähle ein Dingo" ein.

%Vor%

Nun, wenn die ComboBox datengebunden ist, lautet der erste Eintrag "Wähle ein Dingo". Dann, wenn ein Thingo ausgewählt ist, teste ich die ID des SelectedThingo und handle danach entsprechend.

    
D'Hag 29.06.2011 20:43
quelle
0

Ich weiß, dass ich einen alten Post wiederbelebe, aber dies war der erste, der bei meiner Google-Suche auftauchte. In Visual Studio können Sie festlegen, dass die Standardauswahl auf 0 statt auf -1 festgelegt wird, und Ihre erste Auswahl muss der Standardtext sein.

%Vor%     
Hyren 23.01.2016 22:58
quelle
0

Eine andere Option:

%Vor%
    
user9198839 10.01.2018 13:48
quelle

Tags und Links