In einer WPF-App, in einer MVP-App, habe ich ein Kombinationsfeld, für das ich die aus der Datenbank abgerufenen Daten anzeige. Vor den Elementen, die dem Kombinationsfeld hinzugefügt wurden, möchte ich den Standardtext anzeigen, z
" -- Team auswählen --"
Damit beim Laden der Seite und beim Auswählen der Text gelöscht und die Elemente angezeigt werden.
Die Auswahl von Daten aus der Datenbank erfolgt. Ich muss den Standardtext anzeigen, bis der Benutzer ein Element aus dem Kombinationsfeld auswählt.
Bitte führen Sie mich
Focusable="False" IsEditable="True" IsReadOnly="True"
Sie können dies ohne Code tun, indem Sie a verwenden
IValueConverter
.Hier haben Sie die Konverterklasse, die Sie wiederverwenden können.
Und schließlich müssen Sie Ihren Konverter in einem Ressourcenabschnitt deklarieren.
Wo Konverter ist der Ort, an dem Sie die Konverterklasse platziert haben. Ein Beispiel ist:
Das sehr Schöne an diesem Ansatz ist, dass sich der Code in Ihrem Code nicht wiederholt.
quelle
DataTrigger
hier sogar den Konvertercode vermeiden :)Ich mag die Antwort von Tri Q, aber diese Wertekonverter sind schwierig zu bedienen. PaulB hat es mit einem Event-Handler gemacht, aber das ist auch unnötig. Hier ist eine reine XAML-Lösung:
quelle
Niemand sagte, eine reine Xaml-Lösung müsse kompliziert sein. Hier ist eine einfache mit 1 Datenauslöser im Textfeld. Rand und Position wie gewünscht
quelle
<Setter Property="Visibility" Value="Hidden"/>
außerhalb des Auslösers (innerhalb des Stils) hinzuzufügen undVisibility="Hidden"
aus dem eigentlichen Textblock-Element zu entfernenSetzen Sie
IsEditable="True"
auf dasComboBox
Element. Dies zeigt dieText
Eigenschaft vonComboBox
.quelle
Ich weiß nicht, ob es direkt unterstützt wird, aber Sie könnten die Kombination mit einer Beschriftung überlagern und sie auf versteckt setzen, wenn die Auswahl nicht null ist.
z.B.
Dann in der Auswahl Handler geändert ...
quelle
Basierend auf der Antwort von IceForge ich eine wiederverwendbare Lösung vorbereitet:
XAML-Stil:
Anwendungsbeispiel:
quelle
Ich habe es nicht mit Kombinationsfeldern versucht, aber das hat bei mir mit anderen Steuerelementen funktioniert ...
ageektrapped Blogpost
Er verwendet die Adorner-Ebene hier, um ein Wasserzeichen anzuzeigen.
quelle
Die Lösung von HappyNomad war sehr gut und hat mir geholfen, diese etwas andere Lösung zu finden.
quelle
Am einfachsten ist es, CompositeCollection zu verwenden, um Standardtext und -daten aus der Datenbank direkt in ComboBox zusammenzuführen, z
Definieren Sie in Resources StaticResource, um ComboBox-Optionen an Ihren DataContext zu binden, da die direkte Bindung in CollectionContainer nicht ordnungsgemäß funktioniert.
Auf diese Weise können Sie Ihre ComboBox-Optionen nur in xaml definieren, z
quelle
Ich würde folgendes empfehlen:
Definieren Sie ein Verhalten
Benutzer das Verhalten
quelle
Die Antwort von IceForge war ziemlich nah und AFAIK ist die einfachste Lösung für dieses Problem. Aber es hat etwas verpasst, da es nicht funktioniert hat (zumindest für mich wird der Text nie angezeigt).
Am Ende können Sie die Eigenschaft "Sichtbarkeit" des TextBlocks nicht einfach auf "Versteckt" setzen, damit sie ausgeblendet wird, wenn das ausgewählte Element des Kombinationsfelds nicht null ist. Sie müssen es standardmäßig so einstellen (da Sie nicht überprüfen können, ob Trigger nicht null sind , indem Sie einen Setter in XAML an derselben Stelle wie die Trigger verwenden.
Hier ist die tatsächliche Lösung basierend auf seiner, wobei der fehlende Setter direkt vor den Auslösern platziert wird:
quelle
EDIT: Laut Kommentar unten ist dies keine Lösung. Ich bin mir nicht sicher, wie es funktioniert hat und kann das Projekt nicht überprüfen.
Es ist Zeit, diese Antwort für die neueste XAML zu aktualisieren.
Als ich diese SO-Frage fand, die nach einer Lösung für diese Frage suchte, stellte ich fest, dass die aktualisierte XAML-Spezifikation eine einfache Lösung bietet.
Ein Attribut namens "Platzhalter" ist jetzt verfügbar, um diese Aufgabe auszuführen. So einfach ist das (in Visual Studio 2015):
quelle
PlaceholderText
in derSystem.Windows.ComboBox
Klasse kein Eigentum gibt . Dies ist eine Frage zu WPF, nicht zu WinForms.Nicht die beste Vorgehensweise ... aber funktioniert gut ...
Code dahinter
quelle
Ich glaube, ein Wasserzeichen, wie in diesem Beitrag erwähnt, würde in diesem Fall gut funktionieren
Es wird ein bisschen Code benötigt, aber Sie können ihn für jede Combobox oder Textbox (und sogar für Passwortboxen) wiederverwenden, daher bevorzuge ich diesen Weg
quelle
Ich verwende eine IsNullConverter-Klasse in meinem Projekt und es hat bei mir funktioniert. Hier ist der Code dafür in c #. Erstellen Sie einen Ordner mit dem Namen Converter und fügen Sie diese Klasse in diesen Ordner ein, da der verwendete Trigger keinen Wert für statt null unterstützt, und IsNullConverter tut dies einfach
Fügen Sie den Namespace wie folgt in die xaml-Datei ein.
meint
Verwenden Sie diese Zeile unter den Ressourcen, um sie über den XAML-Code verfügbar zu machen
Hier ist der XAML-Code. Ich habe hier den Auslöser verwendet. Wenn also ein Element in der Combobox ausgewählt wird, wird die Sichtbarkeit Ihres Textes falsch.
quelle
// XAML-Code
// ViewModel-Code
quelle
Ein bisschen spät aber ..
Eine einfachere Möglichkeit wäre, der Liste ein Dummy-Datenelement mit dem Parameter IsDummy = true hinzuzufügen und sicherzustellen, dass es nicht HitTestVisable ist und eine Höhe von 1 Pixel (mithilfe eines Konverters) aufweist, damit es nicht angezeigt wird.
Registrieren Sie sich dann einfach bei SelectionChanged und setzen Sie darin den Index auf den Dummy-Elementindex.
Es funktioniert wie ein Zauber und auf diese Weise können Sie sich nicht mit dem Stil und den Farben der ComboBox oder Ihrem Anwendungsthema anlegen.
quelle
Der obige Code zeigt den einfachsten Weg, dies zu erreichen. Deklarieren Sie nach dem Laden des Fensters den Text der Combobox mithilfe der .Text-Eigenschaft der Combobox. Dies kann auch auf DatePicker, Textbox und andere Steuerelemente erweitert werden.
quelle
Ich habe es getan, bevor ich die Combobox mit Daten aus der Datenbank in Codebehind wie folgt verbunden habe -
quelle
Bringen Sie ein Etikett auf der Combobox an.
Binden Sie den Inhalt des Etiketts an die Eigenschaft Combobox Text.
Setzen Sie die Deckkraft der Combobox auf Null, Deckkraft = 0.
Schreiben Sie Standardtext in die Eigenschaft Combobox Text
quelle
Setzen Sie das IsEditable-Attribut nur auf true
quelle
Ich weiß, dass dies halb alt ist, aber was ist mit diesem Weg:
quelle
ComboBox
hat keinEmptySelectionBoxTemplate
Eigentum.