2011-04-26 69 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