Проблема с TreeView в SilverLight - PullRequest
       11

Проблема с TreeView в SilverLight

0 голосов
/ 01 августа 2009

У меня следующая структура класса:

class Organization
{
    string Name;
    List<User> users;
    List<Organization> Children;
}

class User
{
    string Name;
}

Я не могу изменить эти классы. Мне нужно отобразить всю информацию об организациях и пользователях в одном элементе управления TreeView. То есть организационные узлы должны содержать суборганизационные и пользовательские узлы. Вопрос в том, как я могу сделать это, не имея CompositeCollections или Multibindings в Silverlight?

Ответы [ 2 ]

1 голос
/ 01 сентября 2009

Сложной частью этого решения является работа с двумя коллекциями под каждым узлом, а TreeView HierarchicalDataTemplate поддерживает только привязку к одному ItemsSource.

Одним из вариантов является создание ViewModel, который объединяет коллекции в единый класс, представляющий запись в TreeView, которую вы затем можете привязать внутри вашего HierarchicalDataTemplate.

Сначала я создал свой класс ViewModel:

public class TreeViewEntry
{
    public string Name { get; set; }
    public IEnumerable<TreeViewEntry> Children { get; set; }
    public object Model { get; set; }
}

Затем я использовал функцию, немного Linq и некоторую рекурсию, чтобы собрать все объекты в одну коллекцию:

private IEnumerable<TreeViewEntry> OrganizationsToTreeViewEntries(IEnumerable<Organization> orgs)
{
    return (from o in orgs
            select new TreeViewEntry
            {
                Name = o.Name,
                Model = o,
                Children = (from u in o.Users
                            select new TreeViewEntry
                            {
                                Name = u.Name,
                                Model = u
                            }
                            ).Concat(OrganizationsToTreeViewEntries(o.Children))
            });
}


public MainPage()
{
    InitializeComponent();

    var items = OrganizationsToTreeViewEntries(existingOrganizationData);
    OrgTree.ItemsSource = items;
}

Теперь, когда у меня есть объединенный ItemSource, можно легко стилизовать мой HierarchicalDataTemplate:

<UserControl.Resources>
    <common:HierarchicalDataTemplate x:Key="OrgTemplate" ItemsSource="{Binding Children}">
        <StackPanel>
            <TextBlock Text="{Binding Name}"  />
        </StackPanel>
    </common:HierarchicalDataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
    <controls:TreeView x:Name="OrgTree" HorizontalAlignment="Left" Margin="8,8,0,8" Width="225" ItemTemplate="{StaticResource OrgTemplate}" />
</Grid>

Вы можете использовать ValueConverter для настройки таких вещей, как FontWeight, если вы хотите настроить визуальный стиль определенных элементов (например, в моем тестировании я создал ValueConverter для FontWeight, который был привязан к свойству Model TreeViewEntry).

0 голосов
/ 01 августа 2009

Я неправильно понял вопрос - я не знаю, как дерево SL отображало бы и свойство Children , и свойство Users в качестве дочерних узлов. Возможно, вы захотите создать класс-оболочку со свойством AllChildren, которое возвращает пользователей и организации в одной коллекции. HierarchialDataTemplate дерева SL имеет единственное свойство ItemsSource, которое должно быть связано с одной дочерней коллекцией. Извините, я не мог помочь, я бы удалил этот ответ, но я не вижу способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...