WPF привязка данных к связанному списку - PullRequest
2 голосов
/ 17 ноября 2010

Я хочу привязать ListBox к связанному списку

public class MyClass
{
    public string MyText{ get; set; }
    public MyClass PreviousItem{ get; set; }
}

Я хочу использовать экземпляр MyClass в качестве источника данных ListBox, чтобы в основном показать список экземпляра MyClass и всех его PreviousItems.

Конечно, привязка к экземпляру MyClass приведет к отображению только самого верхнего родителя. Каков наилучший подход для этого?

Ответы [ 4 ]

4 голосов
/ 17 ноября 2010

Зачем вам нужна индивидуальная реализация LinkedList?Реализация .NET уже существует: System.Collections.Generic.LinkedList

Кроме этого, у вас есть три основных варианта:

  1. Рекомендуется: если это соответствует вашей бизнес-логике, затруднениепо крайней мере IEnumerable в MyClass (например, списки .NET)
  2. Создайте ViewModel, который обходит ваши элементы MyClass и помещает их в ObservableCollection
  3. Создайте объект IValueConverter для преобразования вашего связанного списка вcollectionType like ObservableCollection
0 голосов
/ 18 ноября 2010

Самая простая вещь (на мой взгляд) - реализовать 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
    }
0 голосов
/ 17 ноября 2010

На самом деле достаточно реализации IEnumerable:

    public IEnumerable<MyClass> TraverseItemsFromCurrent
    {
        get
        {
            var current = this;
            yield return current;
            while (current.PreviousItem != null)
            {
                current = current.PreviousItem;
                yield return current;
            }
        }
    }

И да, использование LinkedList<T> может быть проще и более адекватно вашей цели.

0 голосов
/ 17 ноября 2010

Вы можете использовать класс 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();
        }
    }
...