|
|
|
@ -2,13 +2,9 @@ |
|
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|
|
|
|
|
|
|
using System; |
|
|
|
using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Specialized; |
|
|
|
using System.Reactive; |
|
|
|
using System.Reactive.Disposables; |
|
|
|
using System.Reactive.Linq; |
|
|
|
using System.Reactive.Subjects; |
|
|
|
using Avalonia.Reactive; |
|
|
|
using Avalonia.Utilities; |
|
|
|
|
|
|
|
namespace Avalonia.Collections |
|
|
|
@ -43,9 +39,8 @@ namespace Avalonia.Collections |
|
|
|
Contract.Requires<ArgumentNullException>(collection != null); |
|
|
|
Contract.Requires<ArgumentNullException>(handler != null); |
|
|
|
|
|
|
|
return |
|
|
|
collection.GetWeakCollectionChangedObservable() |
|
|
|
.Subscribe(e => handler.Invoke(collection, e)); |
|
|
|
return collection.GetWeakCollectionChangedObservable() |
|
|
|
.Subscribe(e => handler(collection, e)); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -63,18 +58,13 @@ namespace Avalonia.Collections |
|
|
|
Contract.Requires<ArgumentNullException>(collection != null); |
|
|
|
Contract.Requires<ArgumentNullException>(handler != null); |
|
|
|
|
|
|
|
return |
|
|
|
collection.GetWeakCollectionChangedObservable() |
|
|
|
.Subscribe(handler); |
|
|
|
return collection.GetWeakCollectionChangedObservable().Subscribe(handler); |
|
|
|
} |
|
|
|
|
|
|
|
private class WeakCollectionChangedObservable : ObservableBase<NotifyCollectionChangedEventArgs>, |
|
|
|
private class WeakCollectionChangedObservable : LightweightObservableBase<NotifyCollectionChangedEventArgs>, |
|
|
|
IWeakSubscriber<NotifyCollectionChangedEventArgs> |
|
|
|
{ |
|
|
|
private WeakReference<INotifyCollectionChanged> _sourceReference; |
|
|
|
private readonly Subject<NotifyCollectionChangedEventArgs> _changed = new Subject<NotifyCollectionChangedEventArgs>(); |
|
|
|
|
|
|
|
private int _count; |
|
|
|
|
|
|
|
public WeakCollectionChangedObservable(WeakReference<INotifyCollectionChanged> source) |
|
|
|
{ |
|
|
|
@ -83,43 +73,28 @@ namespace Avalonia.Collections |
|
|
|
|
|
|
|
public void OnEvent(object sender, NotifyCollectionChangedEventArgs e) |
|
|
|
{ |
|
|
|
_changed.OnNext(e); |
|
|
|
PublishNext(e); |
|
|
|
} |
|
|
|
|
|
|
|
protected override IDisposable SubscribeCore(IObserver<NotifyCollectionChangedEventArgs> observer) |
|
|
|
protected override void Initialize() |
|
|
|
{ |
|
|
|
if (_sourceReference.TryGetTarget(out INotifyCollectionChanged instance)) |
|
|
|
{ |
|
|
|
if (_count++ == 0) |
|
|
|
{ |
|
|
|
WeakSubscriptionManager.Subscribe( |
|
|
|
instance, |
|
|
|
nameof(instance.CollectionChanged), |
|
|
|
this); |
|
|
|
} |
|
|
|
|
|
|
|
return Observable.Using(() => Disposable.Create(DecrementCount), _ => _changed) |
|
|
|
.Subscribe(observer); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_changed.OnCompleted(); |
|
|
|
observer.OnCompleted(); |
|
|
|
return Disposable.Empty; |
|
|
|
WeakSubscriptionManager.Subscribe( |
|
|
|
instance, |
|
|
|
nameof(instance.CollectionChanged), |
|
|
|
this); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void DecrementCount() |
|
|
|
protected override void Deinitialize() |
|
|
|
{ |
|
|
|
if (--_count == 0) |
|
|
|
if (_sourceReference.TryGetTarget(out INotifyCollectionChanged instance)) |
|
|
|
{ |
|
|
|
if (_sourceReference.TryGetTarget(out INotifyCollectionChanged instance)) |
|
|
|
{ |
|
|
|
WeakSubscriptionManager.Unsubscribe( |
|
|
|
instance, |
|
|
|
nameof(instance.CollectionChanged), |
|
|
|
this); |
|
|
|
} |
|
|
|
WeakSubscriptionManager.Unsubscribe( |
|
|
|
instance, |
|
|
|
nameof(instance.CollectionChanged), |
|
|
|
this); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|