Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF TreeView绑定多个子集合_C#_Wpf_Binding_Caliburn.micro - Fatal编程技术网

C# WPF TreeView绑定多个子集合

C# WPF TreeView绑定多个子集合,c#,wpf,binding,caliburn.micro,C#,Wpf,Binding,Caliburn.micro,我正在构建一个应用程序来管理连接、数据库、表等。我需要将项目集合与多个子集合绑定(见下文)。我是WPF的新手,不确定这个问题的答案是否已经存在。我已经搜索过了,但没有找到任何我所面临的情况的例子 server1 -database1 --functions <- "static" node ---function1 ---function2 --users <- "static" node ---user1 ---user2 -database2 --functions <-

我正在构建一个应用程序来管理连接、数据库、表等。我需要将项目集合与多个子集合绑定(见下文)。我是WPF的新手,不确定这个问题的答案是否已经存在。我已经搜索过了,但没有找到任何我所面临的情况的例子

server1
-database1
--functions <- "static" node
---function1
---function2
--users <- "static" node
---user1
---user2
-database2
--functions <- "static" node
---function3
---function4
--users <- "static" node
---user3
---user4
对象层次结构:

class DatabaseViewModel
{
    public string Name
    {
         // normal getters and setters for 2way binding
    }
    public IObservableCollection<DbFunctionViewModel> Functions
    {
         // normal getters and setters for 2way binding
    }
    public IObservableCollection<DbUserViewModel> Users
    {
         // normal getters and setters for 2way binding
    }
}

我的问题是,如何将所有用户绑定到名为users的节点,将所有函数绑定到名为functions的节点?如有任何建议,将不胜感激。谢谢

要使您的
子属性
正常工作,您需要为
CollectionContainer
定义一个数据模板:

<HierarchicalDataTemplate DataType="{x:Type viewModels:CollectionContainer}"
                          ItemsSource="{Binding Collection}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
public IList Children
{
    get
    {
        return new[]
        {
            new CollectionContainer("Functions", Functions),
            new CollectionContainer("Users", Users),
        };
    }
}
一些提示:

  • 堆栈面板是冗余的
  • 如果使用
    Text={binding…}
    进行绑定,则
    x:Name
    是多余的

  • 我终于找到了这个复杂绑定场景的解决方案。有一个针对这种情况的框架和一个用于绑定这种层次结构数据的框架。

    收集容器的数据模板?似乎没有必要通过CollectionContainer的数组发明新的复合集合。CompositeCollection是.NET framework的一部分。我写这篇文章的唯一原因是有人写了一篇关于绑定多个集合类型的帖子。我同意你的观点@athari,绑定是多余的。我只是试着做些不同的事情让它发挥作用。另一方面,我在stackpanel中有其他与问题无关的项目(图像、计数),从我所看到的情况来看,它们使用stackpanel正确显示。但是我同意,在这篇文章的范围内,它们是多余的。@StephenBaker您链接到的答案解决了一个不同的问题:它们想要连接集合并将它们显示为单个列表;您希望将多个属性显示为一个列表,该列表可扩展为多个列表。显然,使用
    CompositeCollection
    不会解决您的问题。无论您使用哪种类型而不是
    CollectionContainer
    ,您都需要一个模板,因为它是一个单独的节点类型。这里有一个链接指向我在上面的评论中提到的。如果它解决了您所说的问题,您能将您的答案标记为已接受吗?这将有助于保持“未回答问题”列表的整洁:)
    public IList Children
    {
        get
        {
            return new CompositeCollection
            {
                new CollectionContainer { Collection = Functions },
                new CollectionContainer { Collection = Users }
            };
        }
    }
    
    <HierarchicalDataTemplate DataType="{x:Type viewModels:CollectionContainer}"
                              ItemsSource="{Binding Collection}">
        <TextBlock Text="{Binding Name}"/>
    </HierarchicalDataTemplate>
    
    public IList Children
    {
        get
        {
            return new[]
            {
                new CollectionContainer("Functions", Functions),
                new CollectionContainer("Users", Users),
            };
        }
    }