I have released DynamicData.ReactiveUI which is a very simple adaptor layer to assist with binding dynamic data observables with reactiveui’s ReactiveList object.
Install from Nuget
If you are not familiar with dynamic data and what it enables I suggest:
- Go through previous posts in the blog
- Download the example wpf app from github
.
To cut to the chase, here’s an example. The code takes existing in-memory trade objects, transforms them into a view model proxy and updates the target reactive list object with the resulting change sets. It also pre-filters the data with live trades, applies a user entered filter, orders the resulting data and disposes the proxy when no longer required. Phew – all that in effectively one line of code.
I did the same example without using Reactive UI code see Trading Example Part 3. Integrate with UI where I have explained the code in greater detail
public class RxUiViewer : ReactiveObject, IDisposable { //this is the target list which we will populate from the dynamic data stream private readonly ReactiveList<TradeProxy> _data = new ReactiveList<TradeProxy>(); //the filter controller is used to inject filtering into a observable private readonly FilterController<Trade> _filter = new FilterController<Trade>(); private readonly IDisposable _cleanUp; private string _searchText; public RxUiViewer(ITradeService tradeService) { //Change the filter when the user entered search text changes var filterApplier = this.WhenAnyValue(x => x.SearchText) .Throttle(TimeSpan.FromMilliseconds(250)) .Subscribe(_ => ApplyFilter()); ApplyFilter(); var loader = tradeService.Trades .Connect(trade => trade.Status == TradeStatus.Live) //prefilter live trades only .Filter(_filter) // apply user filter //if targetting Net4 or Net45 platform can use parallelisation for transforms 'cause it's quicker .Transform(trade => new TradeProxy(trade), new ParallelisationOptions(ParallelType.Ordered, 5)) .Sort(SortExpressionComparer<TradeProxy>.Descending(t => t.Timestamp), SortOptimisations.ComparesImmutableValuesOnly) .ObserveOn(RxApp.MainThreadScheduler) .Bind(_data) //bind the results to the ReactiveList .DisposeMany() //since TradeProxy is disposable dispose when no longer required .Subscribe(); _cleanUp = new CompositeDisposable(loader, _filter, filterApplier); } private void ApplyFilter() { if (string.IsNullOrEmpty(SearchText)) { _filter.ChangeToIncludeAll(); } else { _filter.Change(t => t.CurrencyPair.Contains(SearchText, StringComparison.OrdinalIgnoreCase) || t.Customer.Contains(SearchText, StringComparison.OrdinalIgnoreCase)); } } public string SearchText { get { return _searchText; } set { this.RaiseAndSetIfChanged(ref _searchText, value); } } public IReadOnlyReactiveList<TradeProxy> Data { get { return _data; } } public void Dispose() { _cleanUp.Dispose(); } }
coupled with a little xaml can produce this
Very little code, but a very powerful example,
Reblogged this on iReadable.
LikeLike