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绑定到一个控件,因为我知道它可以是任何派生类类型,那么处理这种情况的更好方法是什么?
您的问题有多种解决方案,例如:
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>
正如@Akanksha所说,您可以为您拥有的每个子类型使用DataTemplate
(使用DataType
属性(。对于更复杂的场景,也可以使用DataTemplateSelector
。