Skip to content

Instantly share code, notes, and snippets.

@markryd
Created August 5, 2013 00:45
Show Gist options
  • Save markryd/6152737 to your computer and use it in GitHub Desktop.
Save markryd/6152737 to your computer and use it in GitHub Desktop.
Build and filter an event stream using Rx
Items = new List<FacetViewModel<T>>(names.Select(n => CreateFacetViewModel(n, displayExpression, filterExpression)));
var negatedName = Framework.Common.Extensions.ExpressionExtensions.GetPropertyName<FacetWidget<T>, bool>(f => f.Negate);
var isCheckedName = Framework.Common.Extensions.ExpressionExtensions.GetPropertyName<FacetViewModel<T>, bool>(f => f.IsChecked);
//get isChecked change event from all items
var itemIsCheckedEvents = Items.Select(
i => Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>
(h => i.PropertyChanged += h, h => i.PropertyChanged -= h)
.Where(p => p.EventArgs.PropertyName == isCheckedName));
//and the negate changed event from this
var thisWidgetIsNegatedEvent = new[] {Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>
(h => this.PropertyChanged += h, h => this.PropertyChanged -= h)
.Where(e => e.EventArgs.PropertyName == negatedName)};
itemIsCheckedEvents.Concat(thisWidgetIsNegatedEvent)
.Merge()
.Throttle(TimeSpan.FromMilliseconds(800))
.Subscribe(e => OnFilterChanged());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment