2011-04-26 123 views
4

我期待在一個結構複雜,我似乎無法找到一種方法來顯示它...WPF複雜的分級數據模板

我的情況:

類:里程碑2所列出內部,其他子目錄列表和活動列表。

所以結構可能是這樣的:

M1

  • 里程碑
    • SubMilestone
      • 里程碑
      • 活動
    • Submilestone
  • 活動

任何人有任何的想法是如何建立的?或者可以將我推向一個方向?

回答我的問題

<TreeView ItemsSource="{Binding Path=Project.TrackList}"> 
       <TreeView.Resources> 
        <HierarchicalDataTemplate DataType="{x:Type deto:Track}" ItemsSource="{Binding Path=FaseList}"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Path=TrackType}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type deto:Fase}" ItemsSource="{Binding Path=MilestoneList}"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Path=FaseType}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type deto:Milestone}" ItemsSource="{Binding Converter={StaticResource MConverter}}"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Path=Description}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type deto:Activity}" ItemsSource="{Binding Path=ActivityList}"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Path=Description}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
       </TreeView.Resources> 
      </TreeView> 

和轉換器:

public class MilestoneConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var m = value as Milestone; 
     CompositeCollection collection = new CompositeCollection(); 
     collection.Add(new CollectionContainer() 
     { 
      Collection = m.MilestoneList 
     }); 
     collection.Add(new CollectionContainer() 
     { 
      Collection = m.ActivityList 
     }); 
     return collection; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

回答

8

例如,您應該可以使用CompositeCollection來做到這一點。在XAML中做它可以在引用來源,但使用轉換器應該在這種情況下是可以接受的條款有點複雜:

public class MilestoneItemsSourceCreator : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var input = value as Milestone; 
     CompositeCollection collection = new CompositeCollection(); 
     collection.Add(new CollectionContainer(){ Collection = input.SubMilestones }); 
     collection.Add(new CollectionContainer(){ Collection = input.Activities }); 
     return collection; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
<vc:MilestoneItemsSourceCreator x:Key="MilestoneItemsSourceCreator"/> 
<HierarchicalDataTemplate DataType="{x:Type local:Milestone}" 
          ItemsSource="{Binding Converter={StaticResource MilestoneItemsSourceCreator}}"> 
    <!-- DataTemplate --> 
</HierarchicalDataTemplate> 

這可能無法完全滿足您的階級結構,但你並沒有公佈這些明確地說,可能需要一些調整。

+1

聰明的方式來避免上下文問題 - 非常有幫助,謝謝! – Doug 2013-05-23 14:51:46

0

我已經做了,在過去類似的東西。

您應該在另一個之上顯示兩個列表控件(例如ListView/ListBox),並將第二個數據綁定到第一個所選項目。

就你而言,你似乎需要3個列表控件,根據需要進行調整。

+0

我擔心這個答案......謝謝!回到繪圖桌! :) – 2011-04-26 10:51:43

+0

你可以分享一些代碼.. – Rohit 2011-04-26 10:53:26

+0

我會發布它,當我得到它的工作:) – 2011-04-26 10:55:37