Модель привязки данных дерева WPF и хранилище - PullRequest
4 голосов
/ 30 мая 2010

У меня есть четко определенное древовидное хранилище. Где я могу переименовать элементы, переместить их вверх, вниз и т. Д. Добавить новые и удалить.

Данные хранятся в таблице следующим образом:

Index    Parent   Label    Left    Right
1        0        root     1       14
2        1        food     2       7
3        2        cake     3       4
4        2        pie      5       6
5        1        flowers  8       13
6        5        roses    9       10
7        5        violets  11      12

Представляет следующее дерево:

                       (1) root (14)
         (2) food (7)                  (8) flowers (13)
  (3) cake (4)  (5) pie (6)    (9) roeses (10) (11) violets (12)

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

root
  food
    cake
    pie
  flowers
    roses
    violets

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

Так что мое текущее (и плохое) решение - перезагрузить отображаемое дерево после изменения местоположения.

Любое направление будет хорошим.

Спасибо

Ответы [ 2 ]

2 голосов
/ 31 мая 2010

Вы пытались использовать довольно простую структуру, включая ObservableCollection <> для дочерних узлов? Что-то, что могло бы реализовать интерфейс:

interface ITreeNode<T>
    where T : ITreeNode
{
    string Name { get; set; }
    ObservableCollection<T> Children { get; }
}

Затем вы можете использовать HeirarchicalDataTemplate для XAML вашего TreeView:

<TreeView ItemsSource="{Binding MyTree}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Вам придется самостоятельно перетаскивать, но это должно заставить вас начать все отображать.

Я только недавно должен был сделать вышеперечисленное сам, и эта статья CodeProject помогла мне, на случай, если вам понадобится больше: http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

Обновление:
Поскольку в настоящее время у вас есть все в табличном формате, и я предполагаю, что вы не захотите пересматривать структуру данных по умолчанию, используйте IValueConverter, чтобы получить нужные элементы. Этот код не проверен, но я бы попробовал что-то похожее на следующее:

{Binding Index, Converter={StaticResource myConverter}}

Когда вы объявляете myConverter, дайте ему ссылку на ваши табличные данные. Используя индекс в качестве значения и имея ссылку на таблицу, вы можете вернуть из метода convert IEnumerable с соответствующими результатами.

Дайте мне знать, если вам нужно больше деталей.

0 голосов
/ 30 мая 2010

Не используйте TreeView используйте сторонний элемент управления графиком. В результате краткого поиска в Google было найдено несколько сайтов, посмотрите этот, например GoSilverlightDemo , посмотрите образец OrgChartEditor, вы можете перетаскивать узлы вокруг и изменять ссылки.

...