按类而不是属性进行WPF格式化?

时间:2014-11-18 13:51:50

标签: c# wpf

是否可以按类类型将格式应用于WPF控件。假设我有一个包含五个子类的类,我想根据启动的子类给出不同的颜色。我可以绑定到类并通过子类类型进行区分,还是必须设置要绑定的子类特定属性?

目前我绑定的每个子类中都有一个字符串属性,我使用转换器返回正确的画笔。通过查看班级类型,我想知道是否有更优雅的方式。

4 个答案:

答案 0 :(得分:1)

您可以将ContentControl绑定到您的对象,为每个子类创建不同的DataTemplate。让我们假设你想要显示的控件是一个Button,那么它就是这样的。

<ContentControl Content={Binding ...}>
    <ContentControl.Resources>
        <DataTemplate DataType={x:Type local:Subclass1}>
            <Button Background="Red"/>
        </DataTemplate>
        <DataTemplate DataType={x:Type local:Subclass2}>
            <Button Background="Blue"/>
        </DataTemplate>
        ...
    </ContentControl.Resources>
</ContentControl>

对你的情况来说,这似乎有点沉重的解决方案,但这种结构经常派上用场!

答案 1 :(得分:0)

您可以将color属性绑定到实例并编写一个转换器,它将返回不同类型的不同Brush:

Background={Binding Converter={c:InstanceToColorConverter}},

在InstanceToColorConverter的Convert方法中,如果可以实现语句级联

if(value is A)return new SomeBrush();else 
   if(value is B)return new AntoherBrush();

您还可以创建类Attribute,它存储首选画笔颜色并在Convert方法中检测它,如:

value.GetType().GetCustomAttributes(false).First(x=>x is ColorAttribute).Color

答案 2 :(得分:0)

通常的方法是为XAML中的每个子类设计DataTemplates。但是,您也可以绑定到子类类型。

在您的基础上,提供.Net类型:

public Type MyType
    {
        get
        {
            return GetType();
        }
    }

在你的Xaml中触发MyType,子类将继承它:

<DataTrigger Binding="{Binding MyType}" Value="{x:Type myNamespace:MySubClass1}">
    <Setter ../>
</DataTrigger>
<DataTrigger Binding="{Binding MyType}" Value="{x:Type myNamespace:MySubClass2}">
    <Setter ../>
</DataTrigger>

答案 3 :(得分:0)

我做了以下解决方案:

<Grid Background = "{Binding Converter={StaticResource Myconverter} />

这使用网格所在的datacontext传递我的类对象。

然后我使用转换器检查类类型并返回相应的颜色刷。