【问题标题】:Binding an element from a ObservableCollection's list into a Treeview Checkbox将 ObservableCollection 列表中的元素绑定到 Treeview 复选框
【发布时间】:2025-12-10 13:30:02
【问题描述】:

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

<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;

这是我的 GroupDTO:

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; }
        }
    }

【问题讨论】:

    标签: c# wpf binding treeview


    【解决方案1】:

    我什至不确定您的应用程序是如何工作的。您将 GroupName(字符串类型的属性)绑定到 ItemsSource(需要集合)。然后您尝试绑定到 UserList.Name,但它是项目的集合,它不公开 Name 属性,User 公开。这是一个简化的工作示例。

    Xaml:

    <Window x:Class="WpfTestBench.TreeSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfTestBench="clr-namespace:WpfTestBench"
        Title="Tree sample" Height="300" Width="300">
    <TreeView ItemsSource="{Binding Groups}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="wpfTestBench:Group" ItemsSource="{Binding Users}">
                <Label Content="{Binding Name}" />
    
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate DataType="wpfTestBench:User">
                        <CheckBox Content="{Binding Path=Username}" />    
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
    

    代码隐藏:

    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; }
        }    
    }
    

    执行结果:

    【讨论】:

    • 哎呀,我忘了提到我正在将我的 ItemsSource 与“ObservableCollection groups= new ObservableCollection(_groupDTO.Values.ToArray());”绑定。但我的主要问题是绑定来自 GroupDTO 的 UserList 的用户名。
    • 您正在使用此代码进行组绑定:。这是完全不正确的。然后是下面奇怪的一行:。 ObservableCollection 不公开名为 Name 的属性。
    • 是的,我知道这很奇怪,但用户名对我不起作用,这就是我尝试那些疯狂的东西的原因。你知道问题出在哪里吗?再次查看我的代码后,在检查您的代码时,我发现我有一个 UserNane 属性而不是 UserName。而且我几天来一直在研究这个问题并研究TreeViews。但是感谢您的光!
    • +1 I'm not even sure how your application is working at all
    最近更新 更多