private void OnDataSourcesChanged(IEnumerable <IDataSourceViewModel> oldValue,
                                          IEnumerable <IDataSourceViewModel> newValue)
        {
            var old = oldValue as INotifyCollectionChanged;

            if (old != null)
            {
                old.CollectionChanged -= ItemsSourceOnCollectionChanged;
            }

            FilteredItemsSource.Clear();

            if (newValue != null)
            {
                foreach (IDataSourceViewModel model in newValue)
                {
                    if (PassesFilter(model))
                    {
                        FilteredItemsSource.Add(model);
                    }
                }

                var @new = newValue as INotifyCollectionChanged;
                if (@new != null)
                {
                    @new.CollectionChanged += ItemsSourceOnCollectionChanged;
                }
            }
        }
        private void ItemsSourceOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                for (var i = 0; i < e.NewItems.Count; ++i)
                {
                    var model = (IDataSourceViewModel)e.NewItems[i];
                    if (PassesFilter(model))
                    {
                        var sourceIndex   = e.NewStartingIndex + i;
                        var filteredIndex = FindFilteredIndex(sourceIndex);
                        FilteredItemsSource.Insert(filteredIndex, model);
                    }
                }

                break;

            case NotifyCollectionChangedAction.Remove:
                foreach (IDataSourceViewModel model in e.OldItems)
                {
                    FilteredItemsSource.Remove(model);
                }
                break;

            case NotifyCollectionChangedAction.Reset:
                FilteredItemsSource.Clear();
                break;

            default:
                throw new NotImplementedException();
            }

            UpdateNoDataSourcesMessage();
        }