WPF ComboBox dass zeigt nichts ausgewählt, wenn sie deaktiviert (IsEnabled == false)
-
12-10-2019 - |
Frage
Ich denke, verschiedene Möglichkeiten, um eine WPF ComboBox
Show leer zu haben, als ob nichts ausgewählt wird, wenn IsEnabled
auf false gesetzt ist. Wie immer ich versuche, dies zu tun, ohne dass die gesamte Steuervorlage für die ComboBox
neu zu definieren, die immer einen Kampf, den ich mit WPF habe. Wenn jemand irgendwelche Lösungen elegantere hat als die gesamte ComboBox
Steuervorlage neu zu definieren lassen Sie es mich wissen.
Der Grund für das, was ich versuche zu tun ist, ich eine CheckBox
haben, die eine Option „Alle“ bedeutet und wenn geprüft deaktiviert es die ComboBox
die nur eine einzige Einzelposition holen verwendet wird. Wenn mein CheckBox
geprüft wird, wird es manchmal an die Nutzer verwirrend Wert noch in der ComboBox
zu sehen, da dieser Wert keine Bedeutung in diesem Zustand der Benutzeroberfläche hat.
Eine weitere Voraussetzung ist, dass die Lösung nicht die SelectedValue
ändern kann, SelectedIndex
oder SelectedItem
Werte der ComboBox
da ich das previuosly ausgewählte Element im Fall behalten mag, dass die Benutzer deaktiviert die „All“ CheckBox
.
Lösung auf Basis von HCL Antwort:
<ComboBox IsEnabled="{Binding ElementName=myCheckBox, Path=IsChecked}"
ItemsSource="{Binding Path=MyItems}"
SelectedValue="{Binding Path=MySelectedItem}">
<ComboBox.ItemTemplate>
<DataTemplate>
<ContentControl x:Name="content" Content="{Binding MyItemDescription}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=IsEnabled}"
Value="False">
<Setter TargetName="content"
Property="Visibility"
Value="Hidden" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Lösung
Sie können mit Triggern etwas tun:
Versuchen Sie, die ItemTemplate auf eine leere Datatemplate eingestellt wird, wenn die Box deaktiviert ist. Dadurch wird die Wiedergabe des ausgewählten Elements beeinflussen und daher ausgeblendet.
Eine weitere einfache, aber nicht sehr schöne Lösung wäre es, die Vordergrundfarbe auf das gleiche wie eine Hintergrund-Farbe.
Andere Tipps
Ich glaube, Sie dies mit einem Stil zu tun, anstatt die Steuervorlage neu zu definieren. Verwenden Sie einen Trigger auf der IsEnabled Eigenschaft den Text in der ComboBox gezeigt einzustellen. die SelectedItem zu verändern wäre mein erster Ansatz sein, aber da Sie nicht tun wollen, können Sie Erfolg Einstellung die DisplayMemberPath finden. So etwas wie dieses (nicht getestet) ...
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Trigger.Setters>
<Setter Property="DisplayMemberPath" Value="{x:Null}"/>
</Trigger.Setters>
</Trigger>
</Style.Triggers>
</Style>
Hier ist ein Stil, der das tut, was Sie wollen. Es verwendet eine Technik, die ich die ganze Zeit. Ein Gitter, das mehrere Versionen der Steuerung enthält, und Daten Trigger, dass nur eine Version gewährleisten zu jeder Zeit sichtbar ist
<ComboBox.Style>
<Style TargetType="ComboBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBox">
<DockPanel>
<CheckBox x:Name="IsActive" DockPanel.Dock="Left"/>
<Grid>
<ComboBox
ItemsSource="{TemplateBinding ItemsSource}"
SelectedItem="{TemplateBinding SelectedItem}"
SelectedIndex="{TemplateBinding SelectedIndex}"
SelectedValue="{TemplateBinding SelectedValue}">
<ComboBox.Style>
<Style TargetType="ComboBox">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=IsActive, Path=IsChecked}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
<ComboBox>
<ComboBox.Style>
<Style TargetType="ComboBox">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=IsActive, Path=IsChecked}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
</Grid>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ComboBox.Style>
Auf diese Weise bleibt das ausgewählte Element, ausgewählt Index und ausgewählten Wert, wie Sie wollen. In der Tat, es tut dies ein wenig zu gut; es ist nicht wirklich eine Art und Weise, dass der Benutzer zu sagen, das Kombinationsfeld deaktiviert, da kein Eigentum auf ComboBox
es gibt, die diese Informationen bereitstellt. Ich würde wahrscheinlich implementieren tatsächlich diese als individuelle Kontrolle von ComboBox
abgeleitet, die den Wert des Kontrollkästchens als IsActive
Eigenschaft ausgesetzt. Es gibt viele andere Möglichkeiten, es zu tun.