ReadOnlyObservableProxyCollection_ja - Houzkin/TreeStructures GitHub Wiki

ReadOnlyObservableProxyCollection

指定したコレクションに連動するコレクションです。

Members

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> sourceINotifyCollectionChangedを実装していなかった場合、追加・削除などの変更は反映されません。
また、コンストラクタ内でSourceItemsプロパティを使用しています。
派生先でこのプロパティをオーバーライドすると、初期化時にsourceを使用する処理(イベントの購読とItemsへの変換)をスキップします。

Example

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
}
⚠️ **GitHub.com Fallback** ⚠️