ReadOnlyObservableProxyCollection_ja - Houzkin/TreeStructures GitHub Wiki
指定したコレクションに連動するコレクションです。
public class ReadOnlyObservalbeProxyCollection<T, U> : ReadOnlyObservableCollection<U>, IDisposable{
//constructor
public ReadOnlyObservableProxyCollection(
IEnumerable<T> source,
Func<T,U> convert,
Func<T,U,bool> equality,
Action<U>? removedHandler = null)
: base(new ObservableCollection<U>()) { }
protected new ObservableCollection<U> Items { get; }
protected virtual IEnumerable<T> SourceItems { get; }
protected virtual void ApplyCollectionChange(NotifyCollectionChangedEventArgs e);
protected virtual void Dispose(bool disposing);
public void Dispose();
}
public class ReadOnlyObservableProxyCollection<T> : ReadOnlyObservableProxyCollection<T, T>{
//constructor
public ReadOnlyObservableProxyCollection(
IEnumerable<T> source,
Action<T>? addAction = null,
Action<T>? removedAction = null,
IEqualityComparer<T>? equality = null)
: base(source,
addAction is null ? (x => x) : (x => { addAction.Invoke(x); return x; }),
(x, y) => equality?.Equals(x, y) ?? Equality<T>.ValueOrReferenceComparer.Equals(x, y),
removedAction) { }
}コンストラクタで指定したIEnumerable<T> sourceがINotifyCollectionChangedを実装していなかった場合、追加・削除などの変更は反映されません。
また、コンストラクタ内でSourceItemsプロパティを使用しています。
派生先でこのプロパティをオーバーライドすると、初期化時にsourceを使用する処理(イベントの購読とItemsへの変換)をスキップします。
public static void MethodLL() {
var srcList = new ObservableCollection<char>("ABCDEFG".ToCharArray());
var obsPxy = new ReadOnlyObservableProxyCollection<char, string>(
srcList,
x =>x.ToString().ToUpper(),
(chr, str) => chr.ToString().ToUpper() == str);
Console.WriteLine(string.Join(",", obsPxy));
//A,B,C,D,E,F,G
srcList.Add('X');
srcList.Remove('B');
Console.WriteLine(string.Join(",", obsPxy));
//A, C, D, E, F, G, X
}