将List <object>转换为ObservableCollection <object> </object> </object>的最佳方法

时间:2012-01-30 19:18:49

标签: c# .net wpf

我有List<Object>,其中对象有很多孩子List<Object>大约4-6个级别。

现在我必须将它绑定到WPF TreeView ... :(

将其转换为ObservableCollection<Object>最佳方式是?

6 个答案:

答案 0 :(得分:18)

假设您的意思是ObservableCollection<T>,如果您希望List直接指向ObservableCollection,请使用构造函数:

var oc = new ObservableCollection<Object>(yourListOfObject);

现在,如果你想要解开其中的每一个,你需要做一些工作将它们合并为一个ObservableCollection<T>

答案 1 :(得分:4)

答案的一部分是使用Reactive Extensions(Rx)。你可以从NuGet获得它,它是由微软开发的。借助它,您可以简单地说:myListCollection.ToObservable();

如果您的子集合始终位于具有相同名称的节点中,则可以使用while(item.Collection != null || item.Collection.Count == 0)并将ToObservable()置于循环中

答案 2 :(得分:3)

假设您有一个如此定义的节点类:

public class Node
{
    public ICollection<Node> Children { get; set; }
}

您可以使用递归来转换任何深度级别的List<Node>个集合:

public static ObservableCollection<Node> ToObservableRecursive(ICollection<Node> nodes)
{
    foreach (Node node in nodes)
        if (node.Children != null)
            node.Children = ToObservableRecursive(node.Children);

    return new ObservableCollection<Node>(nodes);
}

答案 3 :(得分:1)

我假设您正在谈论ObservableCollection。简单回答一下,您可以使用ctor:

List<Object> myList = GetList();
new ObservableCollection<Object>(myList);

但是,我认为在分层次组织信息方面还有一些工作要做。

答案 4 :(得分:1)

你的意思是ObservableCollection吗?如果您希望子级别Lists也是可观察的,那么您将需要遍历树并根据需要更改项目,或者单独添加每个项目以开始。

答案 5 :(得分:1)

在您的类型相同之前,您无法执行此处列出的任何解决方案!例如,如果您的列表或ICollection或IEnumerable的类型为string,但您的ObservableCollection必须是NodesComputers或其他类型,则必须获取将List列入该类型,首先!我浪费了太多时间在这些其他虚假的,简化的“解决方案”,这不是解决方案,因为他们没有解释这个或考虑到这个因素。

说这是你的ObservableCollection

public class Computer
{
    public string Name { get; set; }
}

非常标准,对吗?你可能最终会在任意数量的项目中用任意数量的东西替换Computer

如果您在名为List<string>的{​​{1}}中获得计算机名称列表,则不能仅使用以下内容进行转换:

lstComputers

它会说您的类型不匹配,无法从一个转换为另一个,因为您试图将var oc = new ObservableCollection<Computer>(lstComputers); 推送到List<string>。方孔钉在圆孔中。

相反,在获取计算机名称的函数中,您必须将它们全部添加为“特殊”:

ObservableCollection<Computer>

只是因为我们使用了该行public static List<Computer> NetworkComputers() { List<Computer> lstComputers = new List<Computer>(); DirectoryEntry root = new DirectoryEntry("WinNT:"); foreach (DirectoryEntry computers in root.Children) { foreach (DirectoryEntry computer in computers.Children) { if (computer.Name != "Schema" && computer.SchemaClassName == "Computer") { lstComputers.Add(new Computer() { Name = computer.Name }); } } } } 并且正在返回lstComputers.Add(new Computer() { Name = computer.Name });而不是List<Computer>,我们现在可以将其放入List<string>

如果你错过了这艘船并且从一开始就不能这样做,这个帖子谈论了你可以进行转换的其他方式: convert a list of objects from one type to another using lambda expression

所以一旦你在ObservableCollection<Computer>中拥有它,那么你才能做到:

List<Computer>