【问题标题】: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

    除此之外,您基本上有三个选择:

    1. 推荐:如果它适合您的 业务逻辑,至少实现 MyClass 中的 IEnumerable(如 .NET 列表)
    2. 创建一个遍历的 ViewModel 您的 MyClass 项目和 将它们放入 ObservableCollection
    3. 创建一个 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&lt;T&gt; 可能更容易,更适合您的目的。

      【讨论】:

        【解决方案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
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-26
          • 1970-01-01
          • 2011-01-31
          • 2017-05-14
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多