2017-11-06 1 views
2

ObservableCollection<ElementType> 컬렉션에 대한 바인딩은 ComboBox입니다. Name과 Type 속성이 모두 null로 설정되어있는 선택 불가능한 구분 기호를 갖고 싶습니다. name이 문자열로 설정되고 Type이 null이면 선택할 수없는 머리글/제목이되고 싶습니다. 그렇지 않으면 요소를 선택 가능한 요소로 만들지 만 약간의 여백을두고 싶습니다. enter image description hereComboBox 요소의 스타일 지정

내 두 가지 문제

은 다음과 같습니다 : 지금까지 나는 곳

입니다

  • 선택한 항목이 아니라 이름 문자열보다, 이름 공간 ElementType에 개체로 표시됩니다 .
  • 활성화 된 요소의 강조 표시가 MouseOver에 더 이상 표시되지 않습니다.

XAML :

<ComboBox Grid.Column="1" Grid.Row="2" Style="{StaticResource ElementTypeComboBoxStyle}" 
      ItemsSource="{Binding Path=Element.ElementTypeList}" 
      SelectedItem="{Binding Path=Element.SelectedElementType}"> 
    <ComboBox.Resources> 
     <converters:NullToBooleanConverter x:Key="NullToBooleanConverter" /> 
    </ComboBox.Resources> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=Name, Converter={StaticResource NullToBooleanConverter}}" Value="True" /> 
         <Condition Binding="{Binding Path=Type, Converter={StaticResource NullToBooleanConverter}}" Value="True" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="IsEnabled" Value="False" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
           <Separator HorizontalAlignment="Stretch" /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </MultiDataTrigger> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=Name, Converter={StaticResource NullToBooleanConverter}}" Value="False" /> 
         <Condition Binding="{Binding Path=Type, Converter={StaticResource NullToBooleanConverter}}" Value="True" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="IsEnabled" Value="False" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
           <TextBlock Text="{Binding Path=Name}" /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </MultiDataTrigger> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=Name, Converter={StaticResource NullToBooleanConverter}}" Value="False" /> 
         <Condition Binding="{Binding Path=Type, Converter={StaticResource NullToBooleanConverter}}" Value="False" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="IsEnabled" Value="True" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
           <TextBlock Text="{Binding Path=Name}" Margin="10,0,0,0" /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

C 번호 : 나는 내 요구에 조금 무거운 것으로 생각하기 때문에

public class ElementType { 
    public ElementType(string name, Type type) { 
     Name = name; 
     Type = type; 
    } 
    public string Name { get; private set; } 
    public Type Type { get; private set; } 
} 

private static ObservableCollection<ElementType> _elementTypeList = new ObservableCollection<ElementType> { 
    // Controls 
    new ElementType("Controls:", null), 
    new ElementType("Analog Output Slider", typeof(AnalogOutputSliderControl)), 
    new ElementType("Digital Output Button", typeof(DigitalOutputButtonControl)), 

    new ElementType(null, null), // Separator 

    // Indicators 
    new ElementType("Indicators:", null), 
    new ElementType("Numeric Value", typeof(NumericValueIndicator)), 
    new ElementType("ROV Illustration", typeof(RovIllustration)), 
    new ElementType("Trend Graph", typeof(TrendGraphIndicator)), 

    new ElementType(null, null), // Separator 

    // Generic element 
    new ElementType("None", typeof(Element)) 
}; 
[XmlIgnore] 
public static ObservableCollection<ElementType> ElementTypeList { get { return _elementTypeList; } } 
+1

당신이 텍스트와 드롭 다운에 대해 다른 템플릿을 사용하여 해결할 수있는 첫 번째 문제는, ([이 질문]를 참조 https://stackoverflow.com/q/4672867/1997232). 두 번째 것은 - 당신이 원하는 것을 분명하지 않습니다. 또한이 솔루션은 화살표 키 선택 (드롭 다운 없음)과 어떻게 작동합니까? – Sinatr

+0

@Sinatr이 지적했듯이 이것은 Template Selector의 완벽한 시나리오입니다. – XAMlMAX

+1

강조 표시를 유지하는 가장 쉬운 방법은 아무 것도 사용하지 않도록 설정하는 것입니다. separator는 유효성 검사 중에'SelectedItem'으로 설정됩니다. 그것도 화살표 키와 함께 작동합니다. – Sinatr

답변

0

내가, 템플릿 선택기를 위해 가지 않기로 선택했다. XAML에서이 문제를 해결할 수있는 방법을 찾았습니다. 다음 결과를 얻었습니다. 구분 기호와 머리글은 사용할 수 없기 때문에 화살표 키에도 사용할 수 있습니다. "문제"는 헤더의 회색 색상이지만 현재 그대로두고 있습니다.

enter image description here

XAML :

<ComboBox Grid.Column="1" Grid.Row="2" Style="{StaticResource ElementTypeComboBoxStyle}" 
      ItemsSource="{Binding Path=Element.ElementTypeList}" 
      SelectedItem="{Binding Path=Element.SelectedElementType}"> 
    <ComboBox.Resources> 
     <converters:NullToBooleanConverter x:Key="NullToBooleanConverter" /> 
    </ComboBox.Resources> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Setter Property="IsEnabled" Value="False" /> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=Name, Converter={StaticResource NullToBooleanConverter}}" Value="True" /> 
         <Condition Binding="{Binding Path=Type, Converter={StaticResource NullToBooleanConverter}}" Value="True" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
           <Separator HorizontalAlignment="Stretch" /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </MultiDataTrigger> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=Name, Converter={StaticResource NullToBooleanConverter}}" Value="False" /> 
         <Condition Binding="{Binding Path=Type, Converter={StaticResource NullToBooleanConverter}}" Value="False" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="IsEnabled" Value="True" /> 
        <Setter Property="Padding" Value="10,0,0,0" /> 
       </MultiDataTrigger>        
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 
관련 문제