source

오브젝트 유형에 따른 WPF 트리거

nicesource 2023. 4. 24. 23:29
반응형

오브젝트 유형에 따른 WPF 트리거

트리거 객체 유형을 비교할 수 있는 방법이 있습니까?

<DataTrigger Binding="{Binding SelectedItem}" Value="SelectedItem's Type">
</DataTrigger>

배경:툴바가 있으며 선택한 항목 개체에 현재 설정되어 있는 하위 클래스에 따라 단추를 숨깁니다.

감사해요.

이것은 @AndyG의 답변에 근거하고 있습니다만, 타이핑이 강하기 때문에 조금 안전합니다.

DataTypeConverter라는 이름의 IValueConverter를 구현합니다.이 IValueConverter는 개체를 받아들이고 해당 유형을 (시스템으로) 반환합니다.종류):

public class DataTypeConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
      CultureInfo culture)
    {
        return value?.GetType() ?? Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
      CultureInfo culture)
    {
       throw new NotImplementedException();
    }
}

DataTrigger를 Converter를 사용하도록 변경하고 값을 Type:

<DataTrigger Binding="{Binding SelectedItem,  
      Converter={StaticResource DataTypeConverter}}" 
      Value="{x:Type local:MyType}">
...
</DataTrigger>

리소스에서 DataTypeConverter를 선언합니다.

<UserControl.Resources>
    <v:DataTypeConverter x:Key="DataTypeConverter"></v:DataTypeConverter>
</UserControl.Resources>

개체를 가져와서 개체 유형의 문자열을 반환하는 변환기를 사용하면 어떨까요?

Binding="{Binding SelectedItem, Converter={StaticResource ObjectToTypeString}}"

컨버터를 다음과 같이 정의합니다.

public class ObjectToTypeStringConverter : IValueConverter
{
    public object Convert(
     object value, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
    {
        return value.GetType().Name;            
    }

    public object ConvertBack(
     object value, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
    {
        // I don't think you'll need this
        throw new Exception("Can't convert back");
    }
}

xaml 어딘가에 정적 리소스를 선언해야 합니다.

<Window.Resources>
    <convs:ObjectToTypeStringConverter x:Key="ObjectToTypeString" />
</Window.Resources>

여기서 'convs'는 변환기가 있는 네임스페이스입니다.

이게 도움이 됐으면 좋겠다.

트리거는 아니지만 이 방법은 효과가 있었습니다.(트리거 접근은 문자열에 대한 체크박스를 만들 수 없기 때문에 작동하지 않았습니다.Thomas Levesque의 제안과 거의 같습니다.

사용:

xmlns:mscorlib="clr-namespace:System;assembly=mscorlib"

유형에 따라 CheckBox 또는 TextBox:

<ContentPresenter Content="{TemplateBinding SelectedItem}">
      <ContentPresenter.Resources>
               <DataTemplate DataType="{x:Type mscorlib:Boolean}">
                    <CheckBox Height="25" Width="25" HorizontalAlignment="Left" IsChecked="{Binding Path=.}"/>
               </DataTemplate>
                  <DataTemplate DataType="{x:Type mscorlib:String}">
                    <TextBox Height="25" Width="200" HorizontalAlignment="Left" Text="{Binding Path=.}"/>
                </DataTemplate>
       </ContentPresenter.Resources>
</ContentPresenter>

주의: Greg Sansom 솔루션에서는 String으로 반환하거나 위와 같이 mscorlib를 사용해야 합니다.

AndyG가 제안하는 컨버터를 사용하는 것은 좋은 옵션입니다.다른 방법으로 다른 것을 사용할 수도 있습니다.DataTemplate각 타겟 타입에 대해서.WPF가 자동으로 선택됩니다.DataTemplate오브젝트 타입과 일치합니다.

'선택됨'에 할당된 (기본) 유형을 수정할 수 있는 위치에 있는 경우속성을 추가하여 항목'을 선택합니다.

public Type Type => this.GetType();

그런 다음 xaml에서 다음과 같이 DataTrigger를 사용할 수 있습니다.

<DataTrigger Binding="{Binding SelectedItem.Type}" Value="{x:Type local:MyClass}">
</DataTrigger>

AndyG의 좋은 답변에 비해 장점은 XAML에 해당 유형의 마법 문자열이 없고 모든 컴파일이 안전하게 수행된다는 것입니다.단점:모형을 수정해야 합니다(항상 가능하지 않을 수도 있습니다.

언급URL : https://stackoverflow.com/questions/1652341/wpf-trigger-based-on-object-type

반응형