prosource

XAML에서 열거형을 사용하려면 어떻게 해야 합니까?

probook 2023. 4. 18. 23:05
반응형

XAML에서 열거형을 사용하려면 어떻게 해야 합니까?

WPF를 배우고 있는데 다음 문제가 발생했습니다.

XAML이 아닌 다른 네임스페이스에 열거형이 있습니다.

 public enum NodeType
 {
    Type_SYSTEM = 1,              // System
    Type_DB     = 2,              // Database
    Type_ROOT   = 512,            // Root folder
    Type_FOLDER = 1024,           // Folder
 }

내 XAML에서 정수로 이미지를 트리거하고 싶다

<Image.Style>
    <Style TargetType="{x:Type Image}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Type}" Value="{NodeType: }">
                <Setter Property="Source" Value="/Images/DB.PNG"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Type}" Value="128">
                <Setter Property="Source" Value="/Images/SERVER.PNG"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>

XAML 코드에서 직접 정수값을 가져와 열거형과 비교할 수 있는 방법이 있습니까?

내 열거형은 네임스페이스에 있습니다.AnotherNamespace.Types

<DataTrigger Binding="{Binding IntegerType}" Value="MyEnumType.Type_DB">
    <Setter Property="Source" Value="/Images/SERVER.PNG"/> 
</DataTrigger>

여기서도 같은 질문이 있었습니다.최종적인 결과는 IValue Converter를 만드는 것이었습니다.이 IValue Converter는 이 IValue Converter에 합격했습니다.enum가치관으로서 매치하고 싶었던 것ConverterParameter, 그리고 그것은 반환된다.true또는false바인딩된 값이 에 일치하는지 여부에 따라(int)Enum 값입니다.

최종 결과는 다음과 같습니다.

XAML 코드:

<DataTrigger Value="True"
             Binding="{Binding SomeIntValue, 
                 Converter={StaticResource IsIntEqualEnumConverter},
                 ConverterParameter={x:Static local:NodeType.Type_DB}}">

컨버터

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (parameter == null || value == null) return false;

    if (parameter.GetType().IsEnum && value is int)
    {
        return (int)parameter == (int)value;
    } 
    return false;
}

네임스페이스가 XAML 헤더에 포함되어 있는지 확인하기만 하면 커스텀 DP와 열거값을 마크업으로 직접 참조할 수 있습니다.

예를 들어 이 코드를 사용하여 이 작업을 수행합니다.

<DataTemplate.Triggers>
  <MultiDataTrigger>
    <MultiDataTrigger.Conditions>
      <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True" />
      <Condition Binding="{Binding Type}" Value="{x:Static loc:AppProfileItemType.Custom}" />
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
      <Setter TargetName="PART_Delete" Property="Visibility" Value="{x:Static Visibility.Visible}" />
    </MultiDataTrigger.Setters>
  </MultiDataTrigger>
</DataTemplate.Triggers>

DataTrigger에 Style로 액세스할 수 없으므로 대신 DataTemplate 또는 ControlTemplate를 만들어야 합니다(단, ).NET 4는 스타일에서 트리거를 설정하는 기능을 추가합니다).다음과 같은 스타일에서 ControlTemplate를 재지정할 수 있습니다.

<Style x:Key="MyCustomButtonStyle" TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <ContentPresenter />
        <ControlTemplate.Triggers>
          <!-- Put your DataTriggers here -->
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

객체에 바인딩을 하는 DataTemplate의 경우 ContentPresenter를 사용하여 객체의 표시에 사용할 DataTemplate 정의와 함께 표시할 객체에 콘텐츠를 설정할 수 있습니다.DataTrigger를 사용하는 방법은 항상 있지만 스타일을 사용하는 것만큼 직접적이거나 간단하지는 않습니다.

인생을 그렇게 복잡하게 만들 필요는 없어요.Enum은 문자열로 쉽게 변환할 수 있으므로 이 문자열 값을 tirger에서 사용할 수 있습니다.

<Image.Style>
    <Style TargetType="{x:Type Image}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Type}" Value="Type_DB">
                <Setter Property="Source" Value="/Images/DB.PNG"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Type}" Value="Type_SERVER">
                <Setter Property="Source" Value="/Images/SERVER.PNG"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>

그러나 int 값을 열거형에 저장하면...다음 사항을 할당할 수 있습니다.

NodeType val = (NodeType)619;

그럼... 네...변환기를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/14279602/how-can-i-use-enum-types-in-xaml

반응형