2016-11-24 34 views
0

我正在創建自定義用戶控件。我的目標是使控制可重用。 我使用ItemsControl的,這裏是XAML我可以將類型Type的依賴項屬性綁定/設置爲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); } 
     } 
    } 

正如你可以看到我想要/套DataTemplateType結合的ItemsControl.ItemTemplate的DataTemplate中

數據類型

我該如何實現它?

謝謝

+0

它不是因爲您已將DataTemplate明確地分配給ItemTemplate屬性,所以在此處無需設置DataType。數據類型沒有自動匹配選擇。 – Clemens

+0

你可能想要的是能夠在外部設置ItemTemplate。在UserControl中創建DataTemplate類型的依賴屬性,並將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); } 
} 

ItemsControl的在用戶控件的XAML應該是這樣的:

<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

我想「隱藏」/封裝的ItemTemplate的原因是觸發器和樣式。我想避免在幾個地方定義相同的地方 –

+0

不知道這意味着什麼。現在你有一個DataTemplateControl屬性,它必須被設置。 「常用」方法是具有ItemTemplate屬性。 – Clemens

+0

我將DataTemplate.Triggers添加到我的問題中,以顯示我的意思 –

相關問題