2011-01-19 7 views
2

IsEnabledがfalseに設定されている場合、何も選択されていないかのようにWPF ComboBoxを空白にする方法が考えられます。いつものように、私はWPFで常に苦労しているComboBoxのコントロールテンプレート全体を再定義せずにこれをやろうとしています。コントロールテンプレートComboBox全体を再定義するよりも洗練されたソリューションがあれば教えてください。無効なときに何も選択されていないことを示すWPF ComboBox

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

別の要件は、私は、ユーザーが「すべて」CheckBoxのチェックを外した場合にpreviuosly選択されたアイテムを保持したいので、溶液はSelectedValueSelectedIndex、又はComboBoxSelectedItem値を変更できないことです。 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> 

答えて

1

あなたがトリガで何かを行うことができます:

ボックスが無効になっている場合、空のDataTemplateにItemTemplateにを設定してみてください。これは、選択した項目のレンダリングに影響を与え、したがって非表示にします。
シンプルですが非常にうまくいかない解決策は、フォアグラウンドカラーをバックラウンドカラーと同じに設定することです。

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

私は間違っている可能性がありますが、残念ながらこれは私のテストでは機能しませんでした。私はItemTemplateを指定するよりもシンプルさが好きでした。 – jpierson

+0

このメソッドが実際に可能かどうかを調べる際に、私はMSDNフォーラムでこの記事を見てきましたが、これはかなり興味深いようです。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/4c359378-ba98-42a1-a468-0f18f5626fcc – jpierson

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プロパティとしてチェックボックスの値を公開しているでしょう。それを行うには他にもたくさんの方法があります。

+0

HCLによって提案された解決策と私の質問への更新で詳しく述べたが、これよりもまだ短いコードがあり、同じ結果が得られます。私はあなたのテクニックや彼またはバイゼルの詩に他のメリットがあるのが好きです。いずれにせよ、あなたの答えを寄せてくれてありがとう。 – jpierson

+1

私の技術では、コンボボックスが非アクティブであれば別のビジュアルでスワップすることができますが、これは本当にこの特定のケースで考えることができる唯一の利点です。 –

関連する問題