Сложный иерархический шаблон данных WPF - PullRequest
4 голосов
/ 26 апреля 2011

Я смотрю на сложную структуру и не могу найти способ ее отобразить ...

Моя ситуация:

Класс: Milestone имеет 2 списка внутри,список других подуровней и список действий.

Структура может быть такой:

M1

  • Вехи
    • 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
}

Ответы [ 2 ]

8 голосов
/ 26 апреля 2011

Вы должны быть в состоянии сделать это, например, с помощью 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 голосов
/ 26 апреля 2011

Я делал нечто подобное в прошлом.

Вы должны отобразить два элемента управления списком (например, ListView / ListBox), один над другим, и привязать данные второго к выбранному элементу первого.

В вашем случае вам понадобится 3 элемента управления списком, адаптируйте их как вам угодно.

...