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>
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top