我有List<Object>
,其中对象有很多孩子List<Object>
大约4-6个级别。
现在我必须将它绑定到WPF TreeView ... :(
将其转换为ObservableCollection<Object>
的最佳方式是?
答案 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
必须是Nodes
或Computers
或其他类型,则必须获取将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>