c# - WPF 树数据绑定(bind)模型和存储库

标签 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

现在,我的问题是如何以可绑定(bind)的方式表示它,以便 TreeView 可以处理所有可能的数据更改? 重命名很容易,我只需要将标签设为可更新字段即可。但是,如果用户将鲜花移到食物上方怎么办?我可以进行相关数据更改,但它们会导致树中所有其他项目发生完整的数据更改。我发现的所有可绑定(bind)层次结构的示例都适用于非静态树..

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

任何方向都可以。

谢谢

最佳答案

您是否尝试过使用一个相当简单的结构,包括用于子节点的 ObservableCollection<>?实现接口(interface)的东西:

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 时,为其提供对您的表格数据的引用。使用索引作为值并引用表,您可以从转换方法返回具有适当结果的 IEnumerable。

如果您需要更多详细信息,请告诉我。

关于c# - WPF 树数据绑定(bind)模型和存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937952/

相关文章:

c# - 有谁知道一种更快的方法来执行 String.Split()?

c# - MVC C# 应用程序,模型中的 Json 数据

c# - 等待阻塞集合(队列)在 C# 中减小大小

java - 从 getName() 的结果中刷新选项卡名称

c# - 将搜索和排序功能添加到数据绑定(bind)包装器

c# - 结合 WCF 服务库和 WCF 服务应用程序

c# - 绑定(bind) Canvas 上元素的位置

c# - WPF:自定义控件中的多个内容呈现器?

wpf - 绑定(bind)到结构

c# - 将嵌套列表绑定(bind)到 WPF Canvas 面板