WPF复杂的分层数据模板

4

我正在查看一个复杂的结构,但似乎找不到一种合适的方法来展示它...

我的情况:

类: Milestone 内部有两个列表,一个是其他子里程碑列表,另一个是活动列表。

因此结构可能如下:

M1

  • 里程碑
    • 子里程碑
      • 里程碑
      • 活动
    • 子里程碑
  • 活动

有人有任何想法如何创建这个结构吗?或者能指导我一个方向吗?

解决方案

<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
}
2个回答

9

你可以使用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>

这个翻译可能不能完全适用于您的班级结构,但您没有明确发布它们,可能需要进行一些调整。


0

我以前做过类似的事情。

你应该显示两个列表控件(例如ListView/ListBox),一个在另一个上面,并将第二个的数据绑定到第一个选择的项目。

在你的情况下,似乎需要3个列表控件,根据需要进行调整。


我对那个答案感到担忧...谢谢!回到绘图板上吧! :) - Tom Ceuppens
很不幸,我不能发布提到的代码,而且我家里也没有。抱歉。此外,我觉得这个问题是针对模式的,看起来Tom知道如何做了=) - Louis Kottmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接