오브젝트 유형에 따른 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
'source' 카테고리의 다른 글
서브타원 svn: 무시 (0) | 2023.04.24 |
---|---|
셀의 텍스트 양에 관계없이 표 열 너비를 일정하게 설정하시겠습니까? (0) | 2023.04.24 |
함수를 호출하는 Excel 셀 (0) | 2023.04.24 |
vba에서 VLOOKUP 함수 쓰기 (0) | 2023.04.24 |
Bash 스크립트에서 중복 항목 제거 (0) | 2023.04.24 |