WPF DataBinding设计问题

时间:2016-08-31 10:42:14

标签: c# wpf

所以我遇到了关于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的属性绑定到控件,知道它可以是任何派生类类型,处理这种情况的更好方法是什么?

2 个答案:

答案 0 :(得分:1)

您的问题有多种解决方案,例如:

1)ContentControl使用DataTemplates UC_LightingEffect UC_SomeOtherEffectUserControlsCurrentEffectObservableObjectModel类型并且是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来处理更复杂的情况。