WPF IObservable<T> как источник данных для ItemsSource

187
02 мая 2018, 03:02

У меня есть класс, реализующий интерфейс IObservable. В xaml разметке я указал объект этого класса, как источник данных для списка, однако содержимое списка не обновляется.

Вот реализация интерфейса:

private List<IObserver<History>> observers = new List<IObserver<History>>();
public IDisposable Subscribe(IObserver<History> observer)
{
    if (!observers.Contains(observer))
        observers.Add(observer);
    return new Unsubscriber(observers, observer);
}
private class Unsubscriber : IDisposable
{
    private List<IObserver<History>> observers;
    private IObserver<History> observer;
    public Unsubscriber(List<IObserver<History>> observers, IObserver<History> observer)
    {
        this.observers = observers;
        this.observer = observer;
    }
    public void Dispose()
    {
        if (observer != null && observers.Contains(observer))
            observers.Remove(observer);
    }
}
public void SendChanges()
{
    foreach (IObserver<History> observer in observers)
    {
        observer.OnNext(this);
    }
}

Вот классы, которые сигнализируют об обновлении коллекции:

public void Add(Action item)
{
    current.Append(item);
    current = item;
    SendChanges();
}
public void Clear()
{
    current = start;
    start.Break();
    SendChanges();
}
Answer 1

Вместо IObservable<T> реализовал INotifyCollectionChanged. Теперь функции изменения коллекции выглядят так:

public event NotifyCollectionChangedEventHandler CollectionChanged;
public void Add(Action item)
{
    if (current.next != null) CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, current.next.Tail()));
    CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, new List<Action> { item }));
    current.Append(item);
    current = item;
}
public void Clear()
{
    current = start;
    start.Break();
    CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

Теперь все работает.

READ ALSO
c# winforms получить значение из нового окна

c# winforms получить значение из нового окна

есть 2 формына первой, допустим, кнопка открывающая 2-ю форму, на которой есть ползунок TrackBar

189
Полупрозрачный размытый фон с шумами

Полупрозрачный размытый фон с шумами

когда-то давно уже задавался этим вопросом, но без особых успеховРечь идёт о полупрозрачном размытом фоне, да ещё и с шумами(собственно как...

173
DbSet&lt;T&gt;.Add() vs DbSet&lt;T&gt;.AddAsync()

DbSet<T>.Add() vs DbSet<T>.AddAsync()

Есть отличная статья-ответ, которую наверное можно как некий справочник использовать когда необходимо освежить некоторые моменты в понимании...

193
Почему метод Contains для LinkedList&lt;T&gt; выдает False (C#)

Почему метод Contains для LinkedList<T> выдает False (C#)

Понял, что немножко протупил, забыв переопределить метод Equals (object obj)После этого все заработало

180