2010-05-30 55 views
4

我有一个定义良好的树存储库。我可以在哪里重命名项目,将它们向上,向下移动等。添加新的和删除。WPF树数据绑定模型和存储库

的数据被存储在一个表,如下所示:

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可以处理所有可能的数据更改? 重命名很简单,我所需要的只是使标签成为可更新的字段。但是如果用户将鲜花移到食物上方呢?我可以对相关数据进行更改,但会导致树中所有其他项的完整数据更改。而且我发现的可绑定层次结构的所有示例都适用于非静态树。

所以我当前的(和坏的)解决方案是在重定位更改后重新加载显示的树。

任何方向都不错。

感谢

回答

0

不要使用TreeView使用第三方图形控制。一个简短的谷歌搜索提出了几个网站,检查出这个例如GoSilverlightDemo检查OrgChartEditor示例,您可以拖动节点并更改链接。

+0

不错的控制,但这是一个开源项目。所以我不能使用它 – Amirshk 2010-05-30 14:00:48

2

您是否尝试过使用一个相当简单的结构,包括子节点的ObservableCollection <>?

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

然后你可以使用一个HeirarchicalDataTemplate你TreeView的XAML:将实现该接口的东西

<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并显示相应的结果。

让我知道你是否需要更多的细节。