Kann ein WPF ComboBox Anzeige alternativer text, wenn seine Auswahl ist null?
G ' Day!
Möchte ich meine WPF - ComboBox
etwas zeigen alternativen text an, wenn Sie Ihre Daten-Auswahl gebunden ist null
.
View-Modell hat den erwarteten Eigenschaften:
public ThingoSelectionViewModel : INotifyPropertyChanged {
public ThingoSelectionViewModel(IProvideThingos) {
this.Thingos = IProvideThingos.GetThingos();
}
public ObservableCollection<Thingo> Thingos { get; set; }
public Thingo SelectedThingo {
get { return this.selectedThingo; }
set { //set this.selectedThingo and raise the property change notification
}
//...
}
Ansicht XAML-binding der view-Modell in der erwarteten Weise:
<ComboBox x:Name="ComboboxDrive" SelectedItem="{Binding Path=SelectedThingo}"
IsEditable="false" HorizontalAlignment="Left" MinWidth="100"
IsReadOnly="false" Style="{StaticResource ComboboxStyle}"
Grid.Column="1" Grid.Row="1" Margin="5" SelectedIndex="0">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select a thingo</ComboBoxItem>
<CollectionContainer
Collection="{Binding Source={StaticResource Thingos}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
Den ComboBoxItem
eingeklemmt in der Spitze ist ein Weg, um ein zusätzliches Element an der Spitze. Es ist pure chrome: view-Modell bleibt rein und einfach. Es gibt nur ein problem: die Nutzer wollen "Wählen Sie ein thingo" angezeigt, wenn die ComboBox' Selektion ist null.
Den Nutzern nicht wollen eine thingo standardmäßig ausgewählt. Sie wollen, um zu sehen, eine Nachricht, Ihnen zu sagen, Sie wählen Sie eine thingo.
Möchte ich vermeiden, verunreinigen das viewmodel mit einem ThingoWrapper
Klasse mit einem ToString
Methode zurückgeben "Wählen Sie eine thingo:" wenn seine .ActualThingo
- Eigenschaft ist null, einwickeln jedes Thingo
als ich Auffüllen Thingos
, und herauszufinden, einige Weg, um zu verhindern, dass der Benutzer von der Auswahl der genullt Thingo
.
Ist es ein Weg, um die Anzeige "Wählen Sie ein thingo" innerhalb der ComboBox
' Grenzen der Verwendung von reinem XAML, oder reinem XAML-Code und ein paar Zeilen code in der view code-behind-Klasse?
- FWIW: ich landete Umsetzung der ThingoWrapper, ändern der ThingoSelectionViewModel zu bewältigen, die mit der Auswahl des gewickelten null-Wert, und Wege zu finden, wählen Sie automatisch die Whatsy und Fadoozamy Objekte, so dass ich nicht haben, um wickeln Sie Sie, auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Weg des geringsten Widerstandes, das ich hier gefunden habe, ist die Null-Objekt-Pattern ein Beispiel Für die Verwendung dieser Muster in der .NET Framework, betrachten Sie den statischen Wert Verdoppeln.NaN, wenn Sie ein Null-Objekt für Ihre Thingo, Ihrer Ansicht nach Modell Sie können den anfügen an die Spitze der Liste zu bedeuten, "nichts ausgewählt". Erstellen Sie ein DataTemplate für die Thingo Klasse, hat einen DataTrigger für die Null-Objekt-Instanz, zeigt die "Wählen Sie einen Wert".
Ich könnte Ihnen ein code-Beispiel, aber es ist vorbei mein Bett Zeit.
Wie streng ist Ihre MVVM-Anforderung? Können Sie ein wenig code-behind der view?
Vielleicht könnten Sie enthalten die ComboBox in einem raster, so etwas wie dieses:
Dann in der code-behind, fügen Sie einige Logik in einem event-handler:
Einstellung der
IsHitTestVisible="False"
DependencyProperty auf den TextBlock können Maus-events durch, so dass Sie können klicken Sie auf das ComboBox-Steuerelement, und setzen die Sichtbarkeit aufHidden
in der code-behind-hält das layout einer Standard-ComboBox das Aussehen von springen um, wenn der text für die Eingabeaufforderung wird ausgeblendet.Können Sie nicht verwenden Sie eine steuerelementvorlage auslösen, aber man könnte eine einfache Artikel-Vorlage für die combobox:
Edit:
Sieht aus wie der Auslöser der Idee ist ein no go. Ich habe Folgendes in die Kontrolle der Vorlage eines test-combo-box ohne Erfolg:
Zusätzlich, wenn Sie versuchen, um das Steuerelement zu Bearbeiten Vorlage in der Mischung (Sie Aktuelle) ich bin Links mit einer drögen combobox, keine Farben, nur eine hässliche button (aber es gibt eine randlose dropdown). Versuchen Sie, jemand elses Vorschlag (Mike Brown vielleicht).
Original:
Können Sie einen Trigger in der Control-Vorlage. Hier ist ein Beispiel für die Verwendung einer ListBox-von einer app, die ich auf Arbeit bin.
Den oben ControlTemplate hat einen Trigger, der überprüft die Eigenschaft HasItems. Wenn False, wird ein textblock sagen "Keine Elemente" wird angezeigt, in der Mitte der ListBox. Wenn es Teile gibt, werden Sie hier angezeigt.
In deinem Fall, ändern Sie die trigger überprüfen, um zu sehen, ob ItemSelected ist x:Null und legen Sie die Text-Eigenschaft auf "Nichts Ausgewählt".
Ich weiß, dies ist ein Alter thread, aber hier ist, wie ich es mache. Nachdem ich hol die Thingos Sammlung, ich fügen Sie einfach ein neues Thingo mit einer gefälschten ID-Wert und display-Wert "Wählen Sie eine thingo."
Nun, wenn das Kombinationsfeld-Datenbindung, wird das erste Element "Wählen Sie eine thingo." Dann, wenn ein Thingo ausgewählt ist, Teste ich die ID des SelectedThingo, und handeln Sie entsprechend.
Ich weiß, ich bin Wiederauferstehung eine alte post, aber dieser war der erste, der kam auf meine google-Suche.
In Visual Studio können Sie wählen, um die Standard-Auswahl auf 0 statt -1, und gerade haben Sie Ihre erste Auswahl der Standard-text.
Andere Möglichkeit:
HTML: