Правильный способ использования IReactiveDerivedList, когда пользователь вводит термин фильтра в - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть корневой список строк в ReactiveList<string>

private ReactiveList<string> Items { get; set; }

и производный список

private IReactiveDerivedList<string> _FilteredItems;
public IReactiveDerivedList<string> FilteredItems{ get => _FilteredItems; set => this.RaiseAndSetIfChanged(ref _FilteredItems, value); }

У меня также есть термин фильтра, который изменяется при вводе пользователем вa TextBox

private string _FilterTerm;
public string FilterTerm { get => _FilterTerm; set => this.RaiseAndSetIfChanged(ref _FilterTerm, value); }

Наконец, в конструкторе я использую следующее, которое воссоздает производный список каждый раз, когда FilterTerm меняет

this.WhenAnyValue(This => This.FilterTerm).Where(filterTerm => filterTerm != null).Subscribe((filterTerm) =>
{
    FilteredItems = Items.CreateDerivedCollection(x => x, x => x.Contains(FilterTerm));
});

..Я делаю это правильно, или есть лучший способ, так как это похоже на «Я мог бы просто создать новый ReactiveList каждый раз, зачем беспокоиться с IReactiveDerivedList»?


ОБНОВЛЕНИЕ

Я нашел следующий пример, который почти работает для меня, https://janhannemann.wordpress.com/2016/10/18/reactiveui-goodies-ireactivederivedlist-filtering-2/,, но он требует, чтобы я добавил свойство IsFiltered в свою ViewModel, но вв этом случае я не использую ViewModel, я просто использую string!

1 Ответ

0 голосов
/ 13 февраля 2019

Как уже упоминалось в моем комментарии.Платформа ReactiveUI устарела ReactiveList в пользу DynamicData https://reactiveui.net/docs/handbook/collections/

Если вы собираетесь достичь этого в DynamicData, вы должны сделать следующее:

using System.Collections.ObjectModel;
using DynamicData;

public class FilteringClass
{
   private readonly ReadOnlyObservableCollection<string> _filteredItems;
   private readonly SourceList<string> _items = new SourceList<string>();
   private string _filterTerm;

   public FilteringClass(IEnumerable<string> items)
   {
      var filterTermChanged = this.WhenAnyValue(x => x.FilterTerm);
      _items.AddRange(items);
      _items.Connect()
         // This will update your output list whenever FilterTerm changes.
         .AutoRefreshOnObservable(_ => filterTermChanged)
         // This is similar to a Where() statement.
         .Filter(x => FilterTerm == null || x.Contains(FilterTerm))
         // SourceList is thread safe, this will make your output list only be updated on the main thread.
         .ObserveOn(RxApp.MainThreadScheduler)
         // This will make the FilteredItem's be updated with our data.
         .Bind(out _filteredItems)
         // This is a observable, so Subscribe to start the goodness.
         .Subscribe();

   }

   public string FilterTerm
   {
      get => _filterTerm;
      set => RaiseAndSetIfChanged(ref _filterTerm, value);
   }

   public ReadOnlyObservableCollection<string> FilteredItems => _filteredItems;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...