C# 从ObservableCollection绑定元素';将列表放入树视图复选框中

C# 从ObservableCollection绑定元素';将列表放入树视图复选框中,c#,wpf,binding,treeview,C#,Wpf,Binding,Treeview,我正试图创建一个带有ObservableCollection的treeview,但在从对象中的列表获取元素时遇到了问题。发生的事情是,我可以检索组名,它在列表上显示得很好,但是我得到的不是用户名,而是一个空格。下面是一些代码: <TreeView x:Name="treeUsers"> <TreeView.ItemTemplate> <HierarchicalDataTemplate Items

我正试图创建一个带有ObservableCollection的treeview,但在从对象中的列表获取元素时遇到了问题。发生的事情是,我可以检索组名,它在列表上显示得很好,但是我得到的不是用户名,而是一个空格。下面是一些代码:

<TreeView x:Name="treeUsers">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Path=GroupName}" >
                        <Grid Margin="1">
                            <CheckBox Content="{Binding Path=UserList.Name}"  />
                        </Grid>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>

在这段代码中,我从列表中获取用户,然后将他们分成不同的组,然后将列表返回给我的查看器

        private Dictionary<string, GroupDTO> _groupsDTO= new Dictionary<string, GroupDTO>();

        _groupsDTO.Add("GENERAL", new GroupDTO("GENERAL"));
        foreach (NetSendUser user in ObtainUserList())
        {
            UserDTO userDTO = new UserDTO (user);
            _groupsDTO["GENERAL"].UserList.Add(userDTO );
            if (!_groupsDTO.ContainsKey(user.Area))
                _groupsDTO.Add(user.Area, new GroupDTO(user.Area));
            _groupsDTO[user.Area].UserList.Add(userDTO);
        }

        ObservableCollection<GroupDTO> groups= new ObservableCollection<GroupDTO>(_groupDTO.Values.ToArray());
treeUsers.ItemsSource = groups;
private Dictionary\u groupsDTO=new Dictionary();
_添加“一般”,新的“一般”;
foreach(获取用户列表()中的NetSendUser用户)
{
UserDTO UserDTO=新的UserDTO(用户);
_groupsDTO[“GENERAL”].UserList.Add(userDTO);
如果(!_groupsDTO.ContainsKey(user.Area))
_添加(user.Area,新的GroupDTO(user.Area));
_groupsDTO[user.Area].UserList.Add(userDTO);
}
ObservableCollection组=新的ObservableCollection(_groupDTO.Values.ToArray());
treeUsers.ItemsSource=组;
以下是我的组员:

public class GroupDTO: ObjectDTO
    {
        internal GroupDTO(string name)
            : base()
        {
            _groupName = name;
        }

        private string _groupName = default(string);
        public string GroupName
        {
            get { return _groupName ; }
            set
            {
                _groupName = value;
                OnPropertyChanged("GroupName");
            }
        }

        private ObservableCollection<UserDTO> _userList= new ObservableCollection<UserDTO>();
        public ObservableCollection<FuncionarioDTO> UserList
        {
            get { return _userList; }
        }
    }
公共类GroupDTO:ObjectDTO
{
内部GroupDTO(字符串名称)
:base()
{
_groupName=name;
}
私有字符串_groupName=默认值(字符串);
公共字符串组名
{
获取{return\u groupName;}
设置
{
_组名=值;
OnPropertyChanged(“GroupName”);
}
}
private observeCollection_userList=new observeCollection();
公共ObservableCollection用户列表
{
获取{return\u userList;}
}
}

我甚至不知道你的应用程序是如何工作的。您正在将GroupName(字符串类型的属性)绑定到ItemsSource(需要集合)。然后您试图绑定到UserList.Name,但它是一个项的集合,它不公开Name属性,而用户公开。下面是一个简化的工作示例

Xaml:


代码隐藏:

using System.Collections.Generic;

namespace WpfTestBench
{
    public partial class TreeSample
    {
        public TreeSample()
        {
            InitializeComponent();

            DataContext = new Context();
        }
    }

    public class Context
    {
        public Context()
        {
            Groups = new List<Group>();

            var mainGroup = new Group 
            {
                Name = "Main", 
                Users = new List<User> { new User("John"), new User("Bill") } 
            };

            var secondaryGroup = new Group
            {
                Name = "Secondary",
                Users = new List<User> { new User("Tom"), new User("Phil") }
            };

            Groups.Add(mainGroup);
            Groups.Add(secondaryGroup);
        }

        public IList<Group> Groups { get; private set; }
    }

    public class Group
    {
        public string Name { get; set; }
        public IList<User> Users { get; set; }
    }

    public class User
    {
        public User(string name)
        {
            Username = name;
        }

        public string Username { get; private set; }
    }    
}
使用System.Collections.Generic;
命名空间WpfTestBench
{
公共部分类树示例
{
公共树示例()
{
初始化组件();
DataContext=新上下文();
}
}
公共类上下文
{
公共上下文()
{
组=新列表();
var mainGroup=新组
{
Name=“Main”,
用户=新列表{新用户(“约翰”)、新用户(“比尔”)}
};
var secondaryGroup=新组
{
Name=“Secondary”,
用户=新列表{新用户(“Tom”)、新用户(“菲尔”)}
};
组。添加(主组);
添加(第二组);
}
公共IList组{get;private set;}
}
公共课组
{
公共字符串名称{get;set;}
公共IList用户{get;set;}
}
公共类用户
{
公共用户(字符串名称)
{
用户名=名称;
}
公共字符串用户名{get;private set;}
}    
}
执行结果:


哎呀,我忘了提到我正在用“ObservableCollection groups=new ObservableCollection(_groupDTO.Values.ToArray());”绑定我的ItemsSource。但我的主要问题是将我的GroupDTO的用户名绑定到的UserList。您正在使用以下代码进行组绑定:。这是完全错误的。还有下面这句奇怪的话:。ObservableCollection不公开名为Name的属性。是的,我知道这很奇怪,但用户名对我不起作用,这就是为什么我尝试了那个疯狂的东西。你知道问题出在哪里吗?再次查看代码后,在检查您的代码时,我发现我有一个UserNane属性而不是UserName。我已经研究这个问题好几天了,还研究了TreeView。但是谢谢你的光+1对于这个
我甚至不知道你的应用程序是如何工作的
using System.Collections.Generic;

namespace WpfTestBench
{
    public partial class TreeSample
    {
        public TreeSample()
        {
            InitializeComponent();

            DataContext = new Context();
        }
    }

    public class Context
    {
        public Context()
        {
            Groups = new List<Group>();

            var mainGroup = new Group 
            {
                Name = "Main", 
                Users = new List<User> { new User("John"), new User("Bill") } 
            };

            var secondaryGroup = new Group
            {
                Name = "Secondary",
                Users = new List<User> { new User("Tom"), new User("Phil") }
            };

            Groups.Add(mainGroup);
            Groups.Add(secondaryGroup);
        }

        public IList<Group> Groups { get; private set; }
    }

    public class Group
    {
        public string Name { get; set; }
        public IList<User> Users { get; set; }
    }

    public class User
    {
        public User(string name)
        {
            Username = name;
        }

        public string Username { get; private set; }
    }    
}