WPF数据绑定设计问题

本文关键字:问题 数据绑定 WPF | 更新日期: 2023-09-27 18:05:08

所以我有一个关于WPF数据绑定的设计问题,我有一个型号:

 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的Properties绑定到一个控件,因为我知道它可以是任何派生类类型,那么处理这种情况的更好方法是什么?

WPF数据绑定设计问题

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

1( 将ContentControlDataTemplates一起使用(UC_LightingEffectUC_SomeOtherEffectUserControlsCurrentEffect是基本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>

正如@Akanksha所说,您可以为您拥有的每个子类型使用DataTemplate(使用DataType属性(。对于更复杂的场景,也可以使用DataTemplateSelector