У меня есть класс, реализующий интерфейс 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();
}
Вместо 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));
}
Теперь все работает.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей