2011-05-26 53 views
5

我有一個應用程序讀取數據庫表並將其放入樹視圖。爲樹視圖當前的ItemTemplate看起來是這樣的:WPF以編程方式創建樹視圖itemtemplate /列

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="35" /> 
       <ColumnDefinition Width="35" /> 
       <ColumnDefinition Width="35" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" Text="{Binding OrganDisplayName}" /> 
      <TextBox Grid.Column="1" IsEnabled="True" /> 
      <TextBox Grid.Column="2" IsEnabled="True" /> 
      <TextBox Grid.Column="3" IsEnabled="True" /> 
     </Grid> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

然而,在未來有可能是需要增加(由不同值的表中的次數確定)的列多,所以我試圖動態創建它。我會怎麼做呢?

+2

用一個自定義控件替換你的網格,該控件接受你爲'ItemSource'使用的任何對象並動態地創建網格。據我所知,你不能做你想在XAML中聲明的東西。 – FlyingStreudel 2011-05-26 15:12:47

+0

謝謝,我不認爲它可以在XAML中完成,這就是爲什麼我有點困惑。我如何去創建自定義控件?並且,由於這將創建網格(而不是XAML代碼),相應的XAML代碼將是什麼樣子? – Saggio 2011-05-26 15:17:31

回答

2

像這樣的事情也許有可能:

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}"> 
     <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding OrganDisplayName}" /> 

       <!-- If the fields to bind to can be exposed via a collection: 
       <ItemsControl ItemsSource="{Binding Fields}"> --> 
       <ItemsControl ItemsSource="{Binding, Converter={StaticResource SomeCleverConverter}}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Value}" Width="35" /> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 

      </StackPanel> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

這取決於如果樹型視圖的DataContext的(在SubOrganLocation)可以公開字段的集合,或至少使用一個轉換器來獲得它們。最簡單也可能最簡單的方法是公開一組字段,以便您可以執行{Binding Fields}

0

正如FlyingStreudel所說,在這種情況下使用自定義控件是一種好方法。 XAML將如下所示:

 <!-- entity 1 --> 
     <HierarchicalDataTemplate DataType="{x:Type local:Entity1}" ItemsSource="{Binding Items, Mode=OneWay}"> 
      <Grid> 
       <local:Entity1Control/> 
      </Grid> 
     </HierarchicalDataTemplate> 

     <!-- entity 2 (leaf) --> 
     <DataTemplate DataType="{x:Type local:Entity2}"> 
      <Grid> 
       <local:Entity2Control /> 
      </Grid> 
     </DataTemplate> 

您不必使用自定義控件,可以將特定列放在每個模板中。