2016-10-04 76 views
2

這個有點複雜。我試圖創建一個具有treeview和一些其他控件的用戶控件,以創建對其他實現有用的可重用控件。通過屬性設置Treeview HierarchicalDataTemplate

我遇到的問題是我無法弄清楚如何將在控件外部定義的HierarchicalDataTemplate插入到控件內部的樹視圖中。

控制之外,這裏是我的WPF

<Grid> 
    <Grid.Resources> 
     <HierarchicalDataTemplate x:Key="HierarchicalDataTemplate" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Path=Name}"/> 
     </HierarchicalDataTemplate> 
    </Grid.Resources> 

    <masterTreeUserControl:MasterTreeUserControl 
     HierarchicalDataTemplate="{StaticResource HierarchicalDataTemplate}" 
     ItemsSource="{Binding Path=SelectiveListViewModel.Items, UpdateSourceTrigger=PropertyChanged}" 
     SelectedItem="{Binding Path=SelectiveListViewModel.SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
     EnableAdd="False" 
     ItemType="{x:Type viewmodels:LocationItem}" 
     /> 
</Grid> 

的MasterTreeUserControl有HierarchicalDataTemplate的DependencyProperty

HierarchicalDataTemplateProperty = DependencyProperty.Register("HierarchicalDataTemplate",typeof(HierarchicalDataTemplate),typeof(MasterTreeUserControl)); 


private static readonly DependencyProperty HierarchicalDataTemplateProperty; 
    public HierarchicalDataTemplate HierarchicalDataTemplate 
    { 
     get 
     { 
      return (HierarchicalDataTemplate)GetValue(HierarchicalDataTemplateProperty); 
     } 
     set 
     { 
      SetValue(HierarchicalDataTemplateProperty, value); 
     } 
    } 

到目前爲止控制裏面的樹視圖看起來是這樣的。

<TreeView Name="ItemListView" 
       Grid.Row="2" 
       Margin="0,5,0,0" 
       ItemsSource="{Binding Source={StaticResource ItemsCvs}}"> 

在樹形視圖的其他實現中,我通常會以類似於此的方式做HierarchicalDataTemplate。

<TreeView.Resources> 
    <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
     <TextBlock Text="Hello"/> 
    </HierarchicalDataTemplate> 
</TreeView.Resources> 

但是,由於HierarchicalDataTemplate在一個依賴項屬性中,我需要以某種方式將它綁定到Treeview中。我已經看了一遍互聯網(並會繼續這樣做),但無法找到任何相關的東西。

如何注入包含HierarchicalDataTemplate的依賴項屬性到樹視圖中?

回答

1

下面應該工作:

  1. 添加PropertyChangedCallbackHierarchicalDataTemplateProperty
  2. 在處理程序中添加模板來控制資源:

    private static void OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
        var This = d as MasterTreeUserControl; 
        var template = e.NewValue as HierarchicalDataTemplate; 
    
        if(template != null) 
        { 
         This.ItemListView.Resources[new DataTemplateKey(template.DataType)] = template; 
        } 
    } 
    

唯一的問題是,你的HierarchicalDataTemplate必須有DataType設置爲你的模板類型。你應該以某種方式強制執行(驗證等)。

+0

對它進行排序。謝謝。 –

相關問題