WPF TreeView HierarchicalDataTemplate - привязка к объекту с несколькими дочерними коллекциями -> Перезагрузка - PullRequest
0 голосов
/ 09 августа 2011

Я видел несколько постов со схожими проблемами и уже пытался следовать им всем. Теперь, наконец, я получаю все данные на экране, но не так, как я хочу. Но давайте начнем ...

У меня есть ViewModel, которая предоставляет такие данные:

/// <summary>
/// Returns a collection of all the ContinentListViewModel objects
/// </summary>
public static IList<Object> Items
{
    get
    {
        IList<object> childNodes = new List<object>();


        foreach (ContinentViewModel continent in _instance)
        {
            childNodes.Add(continent);
            foreach (CountryViewModel country in continent.CountrytList)
            {
                childNodes.Add(country);
                foreach (BusinessunitViewModel bu in country.BusinessunitList)
                {
                    childNodes.Add(bu);
                }
            }
        }
        return childNodes;
    }
}

Это мой xaml-TreeView-код:

            <TreeView Name="tvwBuList" ItemsSource="{Binding BusinessunitList.Items}" HorizontalAlignment="Left" VerticalAlignment="Top" MinHeight="230" MinWidth="265" MaxHeight="230" MaxWidth="265">
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type local:ContinentViewModel}" ItemsSource="{Binding}">
                            <TextBlock Text="{Binding Path=ContinentCode}" />
                        </HierarchicalDataTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type local:CountryViewModel}" ItemsSource="{Binding}">
                            <TextBlock Text="{Binding Path=CountryCode}" />
                    </HierarchicalDataTemplate>
                    <DataTemplate DataType="{x:Type local:BusinessunitViewModel}">
                        <RadioButton GroupName="BUGroup" Content="{Binding Path=BuCode}" />
                    </DataTemplate>
                </TreeView.Resources>
                <TreeView.ItemContainerStyle>
                    <Style TargetType="TreeViewItem">
                        <!--Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/-->
                        <Setter Property="IsExpanded" Value="True"/>
                        <Setter Property="Foreground" Value="Yellow"/>
                    </Style>
                </TreeView.ItemContainerStyle>
            </TreeView>

А вот как выглядит результат:

http://imgh.us/bu_treeview.jpg

Извините, но я не могу загружать фотографии как новый пользователь, так что держитесь со мной ...

То, что я хочу иметь, представляет собой законченную структуру, подобную этой:

+ AP
|--+ AU
   O-- 164
|--+ CN
   O-- 258
   O-- 277

...

Так чего мне здесь не хватает? Помощь оценена, спасибо!

1 Ответ

2 голосов
/ 09 августа 2011

Шаблоны HierarchicalDataTemplates находятся на одном уровне дерева, поскольку ваши циклы for помещают их в одну коллекцию.По сути, ваша коллекция не соответствует вашим привязкам в XAML.

Я полагаю, чтобы это работало, вам понадобятся отдельные коллекции для каждого уровня, который вы хотите.Таким образом, вам понадобится одна коллекция для континента и вторая для стран.

Тогда вам нужно обновить ваши ресурсы следующим образом:

        <TreeView Name="tvwBuList" ItemsSource="{Binding BusinessunitList.Items}" HorizontalAlignment="Left" VerticalAlignment="Top" MinHeight="230" MinWidth="265" MaxHeight="230" MaxWidth="265">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local:ContinentViewModel}" ItemsSource="{Binding Path=Continents}">
                        <TextBlock Text="{Binding Path=ContinentCode}" />
                    </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type local:CountryViewModel}" ItemsSource="{Binding Path=Countries}">
                        <TextBlock Text="{Binding Path=CountryCode}" />
                </HierarchicalDataTemplate>
                <DataTemplate DataType="{x:Type local:BusinessunitViewModel}">
                    <RadioButton GroupName="BUGroup" Content="{Binding Path=BuCode}" />
                </DataTemplate>
            </TreeView.Resources>
            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <!--Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/-->
                    <Setter Property="IsExpanded" Value="True"/>
                    <Setter Property="Foreground" Value="Yellow"/>
                </Style>
            </TreeView.ItemContainerStyle>
        </TreeView>

Это должно дать вам то, что вы хотите.Я использовал ту же модель для определения структуры сообщения с древовидной структурой, и единственное различие между нашим кодом состоит в том, что я имею каждый уровень в своей собственной коллекции и явно привязываюсь к этой коллекции.

...