基于对象类型触发WPF(WPF Trigger based on Object Type)

2019-09-02 21:22发布

有没有办法做一个触发对象类型的比较?

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

背景:我有一个工具栏,我想隐藏按钮的取决于什么子类当前设置为所选择的项目对象。

谢谢

Answer 1:

为什么不直接使用一个转换器,它接受一个对象,并返回对象类型的字符串?

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”是在转换器的命名空间。

希望这可以帮助。



Answer 2:

这是基于@ AndyG的答案,但有一点更安全,因为它是强类型。

实施名为DataTypeConverter一个的IValueConverter,它接受一个对象,并返回它的类型(作为System.Type的):

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

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

改变你的DataTrigger使用转换器,并设置值的类型:

<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>


Answer 3:

使用由AndyG提出了一个转换器是一个不错的选择。 或者,您也可以使用不同的DataTemplate为每个目标类型。 WPF会自动拾取DataTemplate的对象类型相匹配



Answer 4:

不触发,但这个工作对我来说。 (该触发器的方法并没有因为它不能创建一个字符串的复选框。这是非常托马斯·莱维斯克的建议 )

使用:

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

复选框或文本框取决于类型:

<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>

注:格雷格 - 桑塞姆的解决方案,您要么得返回类型为String或以上使用的mscorlib



Answer 5:

通过将属性分配给“的SelectedItem”您是否在修改的(碱)的位置输入:

public Type Type => this.GetType();

然后,你可以在这样的XAML中使用了DataTrigger:

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

相比AndyG的很好的答案好处是,你不必在你的XAML类型的魔法字符串,但所拥有的一切编译安全。 缺点:您需要修改你的模型 - 这可能并不总是可行的。



文章来源: WPF Trigger based on Object Type