我有一个定义良好的树库.我可以在哪里重命名项目,向上,向下移动等.添加新项目并删除.
数据存储在表中,如下所示:
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可以处理所有可能的数据更改?
重命名很简单,我需要的是使标签成为可更新的字段.但是,如果用户将鲜花移到食物上方呢?我可以对相关数据进行更改,但它们会导致对树中所有其他项的完整数据更改.我发现可绑定层次结构的所有示例都适用于非静态树.
所以我当前(和不好)的解决方案是在重定位更改后重新加载显示的树.
任何方向都会很好.
谢谢
最佳答案 您是否尝试过使用相当简单的结构,包括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.
如果您需要更多细节,请与我们联系.