所以我遇到了关于WPF DataBinding的设计问题, 我有一个模特:
public class LightingEffects : ObservableObjectModel
{
EffectType effectType;
EffectPropertiesBase properties;
public LightingEffects()
{
effectType = EffectType.Static;
properties = this.EffectType == EffectType.Static ? new StaticEffectProperties() : null;
}
名为properties
的成员变量的类型为EffectPropertiesBase
,其中所有其他Effectproperties(其中一个是StaticEffectProperties
,如上面的代码所示)类派生。我根据另一个属性名EffectType
的值将派生类实例分配给父变量。现在我想将properties
的属性绑定到控件,知道它可以是任何派生类类型,处理这种情况的更好方法是什么?
答案 0 :(得分:1)
您的问题有多种解决方案,例如:
1)ContentControl
使用DataTemplates
UC_LightingEffect
UC_SomeOtherEffect
为UserControls
,CurrentEffect
属ObservableObjectModel
类型并且是DataContext
)公开的属性:
<ContentControl Content="{Binding Path=CurrentEffect}"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:LightingEffect}">
<local:UC_LightingEffect/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:SomeOtherEffect}">
<local:UC_SomeOtherEffect />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
2)使用触发器选择模板(例如,如果您使用多个条件来决定使用哪个模板,或者对多个类型使用相同的模板)
<ContentControl Content="{Binding CurrentEffect}" DataContext="{Binding CurrentEffect}"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ContentControl.Resources>
<DataTemplate x:Key="templateEmpty">
<TextBlock Text="Data is null"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ObservableObjectModel}" x:Key="templateLightingEffects">
<local:UC_LightingEffects/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ObservableObjectModel}" x:Key="templateOtherEffects">
<local:UC_SomeOtherEffects />
</DataTemplate>
</ContentControl.Resources>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="ContentTemplate" Value="{StaticResource templateEmpty}" />
<Style.Triggers>
<DataTrigger Binding="{Binding effectType}" Value ="{x:Static local:EffectType.StaticEffect}">
<Setter Property="ContentTemplate" Value="{StaticResource templateLightingEffects}" />
</DataTrigger>
<DataTrigger Binding="{Binding effectType}" Value ="{x:Static local:EffectType.SomeOtherEffect}">
<Setter Property="ContentTemplate" Value="{StaticResource templateOtherEffects}" />
</DataTrigger>
<DataTrigger Binding="{Binding effectType}" Value ="{x:Static local:EffectType.YetAnotherEffect}">
<Setter Property="ContentTemplate" Value="{StaticResource templateOtherEffects}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
答案 1 :(得分:0)
正如@Akanksha所说,你可以为你拥有的每个子类型使用DataTemplate
(使用DataType
属性)。您还可以使用DataTemplateSelector
来处理更复杂的情况。