WPF树数据绑定模型&知识库

时间:2010-05-30 08:20:02

标签: c# wpf data-binding treeview repository-pattern

我有一个定义良好的树库。我可以在哪里重命名项目,向上,向下移动等。添加新项目并删除。

数据存储在表格中,如下所示:

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 个答案:

答案 0 :(得分:2)

您是否尝试过使用相当简单的结构,包括ObservableCollection<>对于子节点?实现界面的东西:

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

然后你可以为你的TreeView的XAML使用HeirarchicalDataTemplate:

<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。

如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:0)

请勿使用TreeView使用第三方图表控件。一个简短的谷歌搜索提出了几个网站,例如查看这个网站GoSilverlightDemo查看OrgChartEditor示例,你可以拖动节点并更改链接。