2

falseに設定さComboBoxれている場合、何も選択されていないかのようにWPFを空白で表示するさまざまな方法を考えています。IsEnabledいつものように、私はこれを実行しようとしていますが、コントロールテンプレート全体を再定義する必要はありません。ComboBoxこれは、常にWPFで苦労しています。コントロールテンプレート全体を再定義するよりもエレガントなソリューションがあればComboBox、私に知らせてください。

私がやろうとしている理由はCheckBox、「すべて」オプションを表すがあり、チェックするとComboBox、単一の個別のアイテムのみを選択するために使用されるを無効にするためです。myCheckBoxをチェックするとComboBox、UIのその状態ではその値が意味を持たないため、値が残っていることをユーザーが混乱させることがあります。

もう1つの要件は、ユーザーが「すべて」のチェックを外した場合に、以前に選択したアイテムを保持したいので、ソリューションがSelectedValue、、、SelectedIndexまたはSelectedItemの値を変更できないことです。ComboBoxCheckBox

HCLの回答に基づく解決策:

<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>
4

3 に答える 3

1

あなたはトリガーで何かをすることができます:

ボックスが無効になっているときに、ItemTemplateを空のDataTemplateに設定してみてください。これは、選択したアイテムのレンダリングに影響を与えるため、非表示にします。
もう1つの単純ですが、あまり良くない解決策は、前景色を背景色と同じに設定することです。

于 2011-01-19T21:11:55.623 に答える
0

コントロールテンプレートを再定義するのではなく、スタイルを使用してこれを行うことができると思います。IsEnabledプロパティのトリガーを使用して、ComboBoxに表示されるテキストを設定します。SelectedItemを変更するのが私の最初のアプローチですが、変更したくないので、DisplayMemberPathの設定に成功する場合があります。このようなもの(テストされていない)...

<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>
于 2011-01-19T21:18:31.190 に答える
0

これがあなたが望むことをするスタイルです。これは、私がいつも使用している手法を採用しています。つまり、コントロールの複数のバージョンを含むグリッドと、一度に1つのバージョンのみが表示されるようにするデータトリガーです。

    <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>

これにより、選択したアイテム、選択したインデックス、および選択した値が必要に応じて保持されます。実際、これは少し上手くいきます。ComboBoxこの情報を公開するプロパティがないため、ユーザーがコンボボックスを非アクティブ化したことを実際に通知する方法はありません。私はおそらくこれをComboBox、チェックボックスの値をIsActiveプロパティとして公開することから派生したカスタムコントロールとして実際に実装するでしょう。それを行うには他にもたくさんの方法があります。

于 2011-01-19T23:24:26.243 に答える