2016-11-24 8 views
0

私はカスタムユーザーコントロールを作成しています。私の目標は、コントロールを再利用可能にすることです。私はItemsControlにを使用しています は、ここにここで制御されるXAMLType型の依存関係プロパティをDataTemplateのDataTypeにバインド/設定することができます

<ItemsControl ItemsSource="{Binding Path=ItemSource , RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:MyItemsControlWithButtons}}}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate DataType="{x:Type Type=typeOf(DataTemplateType)????}"> 
         <ContentControl x:Name="instruction" Content="{Binding Path=DataTemplateControl, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:MyItemsControlWithButtons}}}"/> 
         <DataTemplate.Triggers> 
          <Trigger Property="ItemsControl.AlternationIndex" Value="0"> 
           <Setter Property="Background" Value="#DDDDDD" TargetName="instruction" /> 
          </Trigger> 
          <Trigger Property="ItemsControl.AlternationIndex" Value="1"> 
           <Setter Property="Background" Value="#EEEEEE" TargetName="instruction" /> 
          </Trigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
</ItemsControl> 

です:MyItemsControlWithButtons

public partial class DraggableItemsControlWithButtons : UserControl 
    { 
     public DraggableItemsControlWithButtons() 
     { 
      InitializeComponent(); 
     } 

     public static readonly DependencyProperty DataTemplateTypeProperty = 
     DependencyProperty.Register(nameof(DataTemplateType), typeof(Type), typeof(DraggableItemsControlWithButtons), new UIPropertyMetadata(null)); 
     public Type DataTemplateType 
     { 
      get { return (Type)GetValue(DataTemplateTypeProperty); } 
      set { SetValue(DataTemplateTypeProperty, value); } 
     } 

     public static readonly DependencyProperty ItemSourceProperty = 
     DependencyProperty.Register(nameof(ItemSource), typeof(IEnumerable), typeof(DraggableItemsControlWithButtons), new UIPropertyMetadata(null)); 
     public IEnumerable ItemSource 
     { 
      get { return (IEnumerable)GetValue(ItemSourceProperty); } 
      set { SetValue(ItemSourceProperty, value); } 
     } 

     public static readonly DependencyProperty DataTemplateControlProperty = 
     DependencyProperty.Register(nameof(DataTemplateControl), typeof(Control), typeof(DraggableItemsControlWithButtons), new UIPropertyMetadata(null)); 
     public Control DataTemplateControl 
     { 
      get { return (Control)GetValue(DataTemplateControlProperty); } 
      set { SetValue(DataTemplateControlProperty, value); } 
     } 
    } 

私はItemsControl.ItemTemplateのDataTemplateを

のデータ型に/セットDataTemplateTypeをバインドしたい見ることができるように

どうすれば実現できますか?

あなたは

+0

それISN ItemTemplateプロパティにDataTemplateを明示的に割り当てているため、ここでDataTypeをすべて設定する必要はありません。データ型による自動選択はありません。 – Clemens

+0

おそらくあなたは、ItemTemplateを外部から設定することができます。 UserControlでDataTemplate型のdepedencyプロパティを作成し、ItemsSource ItemTemplateをバインドします。 – Clemens

+0

@Clemensサンプルコードを提供できますか? –

答えて

1

あなたはprobaby ItemTemplateプロパティによってDataTemplateControlプロパティを置き換えることによって、あなたの制御を簡素化することができありがとうございました。また、ItemsControlとの類似性を完成させるには、ItemSourceプロパティの名前をItemsSourceに変更します。

public static readonly DependencyProperty ItemsSourceProperty = 
    DependencyProperty.Register(
     nameof(ItemsSource), typeof(IEnumerable), 
     typeof(DraggableItemsControlWithButtons)); 

public IEnumerable ItemsSource 
{ 
    get { return (IEnumerable)GetValue(ItemsSourceProperty); } 
    set { SetValue(ItemsSourceProperty, value); } 
} 

public static readonly DependencyProperty ItemTemplateProperty = 
    DependencyProperty.Register(
     nameof(ItemTemplate), typeof(DataTemplate), 
     typeof(DraggableItemsControlWithButtons)); 

public DataTemplate ItemTemplate 
{ 
    get { return (DataTemplate)GetValue(ItemSourceProperty); } 
    set { SetValue(ItemSourceProperty, value); } 
} 

UserControlのXAMLでItemsControlには、次のようになります。

<ItemsControl 
    ItemsSource="{Binding ItemsSource, 
          RelativeSource={RelativeSource AncestorType=UserControl}}" 
    ItemTemplate="{Binding ItemTemplate, 
          RelativeSource={RelativeSource AncestorType=UserControl}}" /> 

それからちょうどItemTemplateプロパティを持つ他のコントロールのようにItemTemplateにを割り当てます:

<local:DraggableItemsControlWithButtons ItemSource="{Binding ...}"> 
    <local:DraggableItemsControlWithButtons.ItemTemplate> 
     <DataTemplate> 
      ... 
     </DataTemplate> 
    </local:DraggableItemsControlWithButtons.ItemTemplate> 
</local:DraggableItemsControlWithButtons> 
+0

私が "隠す"/encapsualteのItemTemplateにしたい理由は、トリガー&スタイルです。私はいくつかの場所で同じものを定義することを避けたい –

+0

それは何を意味するか分かりません。これでDataTemplateControlプロパティが設定されました。このプロパティは設定する必要があります。 「通常の」アプローチは、ItemTemplateプロパティを持つことです。 – Clemens

+0

DataTemplate.Triggersを私の質問に追加して、私が意味していたことを示しました。 –

関連する問題