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?
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.
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.
Sie können keinen Steuervorlagen-Trigger verwenden, aber Sie könnten eine einfache Elementvorlage für die Combobox einrichten:
%Vor%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".
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.
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%