是否可以按类类型将格式应用于WPF控件。假设我有一个包含五个子类的类,我想根据启动的子类给出不同的颜色。我可以绑定到类并通过子类类型进行区分,还是必须设置要绑定的子类特定属性?
目前我绑定的每个子类中都有一个字符串属性,我使用转换器返回正确的画笔。通过查看班级类型,我想知道是否有更优雅的方式。
答案 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传递我的类对象。
然后我使用转换器检查类类型并返回相应的颜色刷。