2011-01-19 59 views
2

我想出了不同的方法來讓WPF ComboBox顯示爲空,就好像IsEnabled設置爲false時沒有選擇任何東西。像往常一樣,我試圖做到這一點,而不必重新定義ComboBox的整個控制模板,這始終是我與WPF的鬥爭。如果有人有任何解決方案比重新定義整個ComboBox控制模板更優雅,請讓我知道。WPF ComboBox在禁用時不顯示任何選項(IsEnabled == false)

我試圖做的原因是我有一個CheckBox代表一個「全部」選項,當選中時,它會禁用ComboBox,它只用於選擇一個單獨的項目。如果我的CheckBox被選中,用戶有時會看到ComboBox中剩餘的值,因爲該值在用戶界面的這種狀態下沒有任何意義。

另一個要求是,該解決方案不能修改ComboBoxSelectedValueSelectedIndex,或SelectedItem值,因爲我想保留的情況下的previuosly選擇的項目,該用戶取消選中「全部」 CheckBox

解決方案基於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

你可以做一些與觸發器:

嘗試ItemTemplate中設置爲空的DataTemplate當框被禁用。這將影響所選項目的渲染並因此隱藏它。
另一個簡單但不是很好的解決方案是將前景色設置爲與背景色相同。

0

我相信你可以用Style來做到這一點,而不是重新定義控件模板。在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 2011-01-19 21:55:16

+0

在試圖找出這種方法是否真的有可能的時候,我在MSDN論壇上發現了這篇文章,看起來很有趣。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/4c359378-ba98-42a1-a468-0f18f5626fcc – jpierson 2011-01-20 00:57:47

0

這是一種風格,做你想做的。它採用了我一直使用的技術:包含多個控件版本的網格,以及確保一次只能看到一個版本的數據觸發器。

<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屬性。還有很多其他方法可以做到這一點。

相關問題