Перейти от IReactiveDerivedList к DynamicData - PullRequest
2 голосов
/ 19 октября 2019

Имеет простой код в старой версии ReactiveUI:

var allItems = new ObservableCollection<Model>(items);
var filteredItems = allItems.CreateDerivedCollection(
 x => x,
 Filter,
 Comparer.Compare);

, где Filter и Compare имеет простые подписи:

private bool Filter(Model item)
public int Compare(Model x, Model y)

иногда я меняю элементы в других потоках (большие изменения, без INPC) или измените стратегии Filter \ Compare и просто сделайте filteredItems.Reset();


В DynamicData я пытаюсь:

          ReadOnlyObservableCollection<Model> filteredItems;
          var allItems = new ObservableCollection<Model>(items);
          var cancellation = allItems
            .ToObservableChangeSet()
            .Filter(Filter)
            .Sort(Comparer)
            .ObserveOn(SynchronizationContext.Current)
            .Bind(out filteredItems)
            .DisposeMany()
            .Subscribe();

но не найдено, как Reset это ^ или filteredItems.

1 Ответ

2 голосов
/ 20 октября 2019

Хотел бы я дать вам прямой ответ, но я довольно плохо знаком с ReactiveUI. Умудрился использовать DynamicData для чего-то и подумал, что вы не против этого обмена.

Если то, что я скажу позже, вам не поможет, вот наиболее важные ресурсы, которые я могу найти:


В моем случае я использовал SourceList или SourceCache как тип для чего-то похожего на ваш allItems.

SourceCache<Model, string> allItems =
    new SourceCache<Model, string>(m => m.Id);

// assuming each model has unique id; if it doesn't then use SourceList

Я бы тогда имел BindingList<Model> как тип для чего-то похожего наyour 'selectedItems'.

BindingList<Model> filteredItems = new BindingList<Model>();

Привязка должна выглядеть примерно так:

allItems
    .Connect()
    ...
    .ObserveOn(...)
    .Bind(filteredItems)
    .Subscribe();

Для массового редактирования списка я бы назвал что-то вроде

allItems.Edit(
    innerList => {
    innerList.Clear();

    // edit
    // innerList.AddOrUpdate(...);
});

Ура!

...