2011-01-19 9 views
2

IsEnabled이 false로 설정된 경우 아무 것도 선택하지 않은 것처럼 WPF ComboBox을 공백으로 표시하는 다른 방법이 있다고 생각합니다. 언제나처럼 항상 WPF를 가지고있는 투쟁 인 ComboBox에 대한 전체 컨트롤 템플릿을 다시 정의하지 않고이 작업을 수행하려고합니다. 누구나 ComboBox 제어 템플릿 전체를 재정의하는 것보다 더 좋은 해결책이 있다면 알려 주시기 바랍니다.비활성화되었을 때 아무 것도 표시하지 않는 WPF ComboBox

제가하려는 것은 "전체"옵션을 나타내는 CheckBox이며,이 옵션을 선택하면 하나의 개별 항목 만 선택하는 데 사용되는 ComboBox을 사용할 수 없습니다. 내 CheckBox을 선택하면 사용자가 UI의 해당 상태에서 그 값이 의미가 없기 때문에 사용자가 ComboBox에 남아있는 값을 볼 때 혼란 스러울 수 있습니다.

또 다른 요구 사항은 나는 사용자가 "모두"CheckBox 선택 취소 경우에 previuosly 선택한 항목을 유지하고자하기 때문에 솔루션이 ComboBoxSelectedValue, SelectedIndex, 또는 SelectedItem 값을 수정할 수 없다는 것입니다. 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을 설정하십시오. 선택한 항목의 렌더링에 영향을 주어 숨길 수 있습니다.
간단하지만 아주 좋은 해결책은 전경색을 backround 색상과 동일하게 설정하는 것입니다.

0

컨트롤 템플릿을 다시 정의하는 대신 스타일을 사용하여이 작업을 수행 할 수 있다고 생각합니다. IsEnabled 속성의 Trigger를 사용하여 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

다음은 원하는대로하는 스타일입니다. 그것은 항상 사용하는 기술을 사용합니다 : 여러 버전의 컨트롤을 포함하는 그리드와 한 번에 하나의 버전 만 볼 수 있도록하는 데이터 트리거.

<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에는 속성이 없으므로 실제로 사용자가 콤보 상자를 비활성화했다는 것을 나타내는 방법이 없습니다. 아마도 실제로 IsActive 속성으로 확인란의 값을 노출 ComboBox에서 파생 된 사용자 지정 컨트롤을 구현할 것입니다. 그것을 할 수있는 다른 방법이 많이 있습니다.

+0

HCL에서 제안한 솔루션과 제 질문에 대한 업데이트에 대해 자세히 설명했지만 멋진 아이디어입니다. 여전히 이것보다 훨씬 짧은 코드이며 동일한 결과를 얻을 수 있습니다.나는 당신의 테크닉이나 그의 바이어스 구절에 다른 혜택이 있다는 것에 대해 궁금합니다. 어느 쪽이든, 귀하의 답변에 기여해 주셔서 감사합니다. – jpierson

+1

내 기술을 사용하면 콤보 상자가 비활성 상태이면 다른 시각적으로 바꿀 수 있지만 실제로이 경우에만 생각할 수있는 유일한 이점입니다. –

관련 문제