Несколько решений:
1) Использование ReactiveUI
ReactiveUI - это продуманный MVVM-каркас, созданный с учетом программирования и динамических данных Reactive. Поскольку вы упомянули, что ваш вариант использования является приложением WPF, рекомендуется использовать ReactiveUI сверху. Поскольку вы используете свойство Viewmodel для своего фильтра, эта модель представления должна реализовывать INotifyPropertyChanged, который с помощью реактивной функции позволяет вам написать:
var observableFilter = this.WhenAnyValue(viewModel => viewModel.FilterId)
.Select(MakeFilter);
Это делает IObservable<int>
из свойства FilterId
, так чтокогда ваше представление меняет значение, привязка WPF обновит свойство viewmodel, а observableFilter
создаст новое значение. Добавьте метод
private Func<DemoClass,bool> MakeFilter(int id)
{
return demoClass => demoClass.Id == id;
}
, который преобразует ваше значение в предикат, так же, как в исходном примере, за исключением того, что фильтр перестраивается для каждого значения, создаваемого наблюдаемой.
затем в вашем исходном спискеpipe
SL.Connect()
.Filter(observableFilter)
.Bind(out ReadOnlyObservableCollection<DemoClass> temp)
.Subscribe();
На этот раз ваш фильтр применяется каждый раз, когда он меняется
** 2) Использование объекта **
Очень похоже на предыдущее решение, ноне использует реактивные, если вы не хотите. Этот метод будет использовать Subject<T>
в качестве источника, наблюдаемого для вашего фильтра.
В вашем классе viewmodel вы бы написали свойство, подобное этому
private Subject<int> idChanged = new Subject<int>();
private int _filterId;
public FilterId
{
get => _filterId;
set
{
_filterId = value;
idChanged.OnNext(value);
}
}
Этот Subject<int>
является объектом, которыйявляется IObservable, и его метод OnNext(int value)
заставит его произвести значение. Затем этот предмет используется почти так же, как и первое решение:
var observableFilter = idChanged
.Select(MakeFilter);
Этот последний бит является единственным отличием.
Я рекомендую вам использовать первое решение и изучитьинтегрированная платформа, которая отвечает за поддержку DynamicData