2016-08-31 17 views
0

はので、私はWPFデータバインディング、 に関する設計上の問題が生じています、私はモデルを持っている:WPFデータバインディングのデザインの問題

public class LightingEffects : ObservableObjectModel 
{ 
    EffectType effectType; 
    EffectPropertiesBase properties; 

    public LightingEffects() 
    { 
     effectType = EffectType.Static; 
     properties = this.EffectType == EffectType.Static ? new StaticEffectProperties() : null; 
    } 

propertiesという名前のメンバ変数は、他のすべてのEffectpropertiesタイプEffectPropertiesBaseである(そのうちの一つれます上のコードで分かるようにStaticEffectProperties)クラスが派生します。別のプロパティー名EffectTypeの値に基づいて、派生クラス・インスタンスを親変数に割り当てます。今、私は任意の派生クラス型の可能性があることを知って、コントロールにpropertiesのプロパティをバインドしたい、そのようなシナリオを処理するためのより良いアプローチは何ですか?

+2

タイプに基づいて選択する必要のある表示のために、これらの具体的なタイプごとにテンプレートを作成する必要があります.... UIバインディング用の一般的なテンプレートはありません – Akanksha

答えて

1

あなたの問題に複数のソリューションを使用すると、たとえば、存在することができます:

1)CurrentEffectベースObservableObjectModelタイプのものであり、プロパティは、あなたによって公開され、UC_LightingEffectUC_SomeOtherEffectUserControlsある(DataTemplatesContentControlを使用します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> 
0

@Akankshaは、DataTypeプロパティを使用しているすべてのサブタイプにDataTemplateを使用できると言っていました。さらに複雑なシナリオにはDataTemplateSelectorを使用することもできます。