【问题标题】:WPF databinding to a linked listWPF 数据绑定到链表
【发布时间】:2011-05-11 12:57:29
【问题描述】:
我想将一个 ListBox 数据绑定到一个链表
public class MyClass
{
public string MyText{ get; set; }
public MyClass PreviousItem{ get; set; }
}
我想使用 MyClass 的一个实例作为 ListBox 的数据源,基本上显示 MyClass 实例的列表以及所有它的 PreviousItems。
当然,绑定到 MyClass 的实例将导致仅显示最顶层的父级。最好的方法是什么?
【问题讨论】:
标签:
wpf
data-binding
linked-list
datasource
【解决方案1】:
为什么首先需要一个 LinkedList 的自定义实现?已经有一个 .NET 实现:System.Collections.Generic.LinkedList
除此之外,您基本上有三个选择:
- 推荐:如果它适合您的
业务逻辑,至少实现
MyClass 中的 IEnumerable(如 .NET 列表)
- 创建一个遍历的 ViewModel
您的 MyClass 项目和
将它们放入
ObservableCollection
- 创建一个 IValueConverter 对象以
将您的链接列表转换为
collectionType 喜欢
ObservableCollection
【解决方案2】:
您可以使用 BCL LinkedList<T> 类。或者,如果你非常喜欢你的课程,你可以像这样实现IEnumerable
public class MyClass : IEnumerable<MyClass>
{
public string MyText { get; set; }
public MyClass PreviousItem { get; set; }
public IEnumerator<MyClass> GetEnumerator()
{
var item = this;
do
{
yield return item;
item = item.PreviousItem;
} while (item != null);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
【解决方案3】:
实际实现 IEnumerable 就足够了:
public IEnumerable<MyClass> TraverseItemsFromCurrent
{
get
{
var current = this;
yield return current;
while (current.PreviousItem != null)
{
current = current.PreviousItem;
yield return current;
}
}
}
是的,使用LinkedList<T> 可能更容易,更适合您的目的。
【解决方案4】:
最简单的事情(在我看来)是实现 IEnumerable
public class MyClass : IEnumerable<MyClass>
{
public string MyText { get; set; }
public MyClass PreviousItem { get; set; }
IEnumerator<MyClass> IEnumerable<MyClass>.GetEnumerator()
{
for (var item = this; item.PreviousItem != null; item = item.PreviousItem)
yield return item;
}
public IEnumerator GetEnumerator()
{
return ((IEnumerable<MyClass>)this).GetEnumerator();
}
}
那么你的代码应该是这样的
public Window1()
{
MyClass item1 = new MyClass() {MyText = "No1"};
MyClass item2 = new MyClass() {MyText = "No2"};
MyClass item3 = new MyClass() {MyText = "No3"};
MyClass item4 = new MyClass() {MyText = "No4"};
item4.PreviousItem = item3;
item3.PreviousItem = item2;
item2.PreviousItem = item1;
DataContext = item4; // your first item
}