/// <summary> /// /// </summary> /// <typeparam name="TItem"></typeparam> /// <typeparam name="TValue"></typeparam> /// <param name="source"></param> /// <param name="selector"></param> /// <param name="whenEmpty"></param> /// <param name="trackItemChanges">If true we subscribe to property changes for each item. This is much slower.</param> /// <returns>A tracker with Value synced with source.Max()</returns> public static MaxTracker <TValue> TrackMax <TItem, TValue>(this ReadOnlyObservableCollection <TItem> source, Expression <Func <TItem, TValue> > selector, TValue?whenEmpty, bool trackItemChanges) where TItem : class, INotifyPropertyChanged where TValue : struct, IComparable <TValue> { var onItemChanged = trackItemChanges ? source.ObserveItemPropertyChanged(selector, false) : null; var mapped = source.AsMappingView(selector.Compile(), onItemChanged); return(new MaxTracker <TValue>(mapped, mapped.ObserveCollectionChangedSlim(false), whenEmpty)); }