Как связать наблюдения SourceList с использованием ReactiveUI и DynamicData? - PullRequest
1 голос
/ 12 марта 2019

Извинения, если терминология отключена;Я разработчик для iOS, использующий Xamarin.iOS для разработки приложения.Я использую ReactiveUI с DynamicData и архитектурой MVVM.Я довольно доволен RxSwift и концепциями FRP в целом.У меня есть Модель, которая публикует SourceList<MyThing>, в соответствии с документами, например, так:

// Property declarations
private readonly SourceList<MyThing> Things;
public IObservableCollection<MyThing> ThingsBindable { get; }

// Later, in the constructor...
Things = new SourceList<MyThing>();
// Is this of the right type?
ThingsBindable = new ObservableCollectionExtended<MyThing>();
Things
    .Connect()
    .Bind(ThingsBindable)
    .Subscribe();

Я могу успешно использовать .BindTo() в моем View (т.е. ViewController в iOS-земле), чтобы получить UITableViewобновить при изменении модели:

Model
    .WhenAnyValue(model => model.ThingsBindable)
    .BindTo<MyThing, MyThingTableViewCell>(
        tableView,
        new NSString("ThingCellIdentifier"),
        46, // Cell height
        cell => cell.Initialize());  

Я бы хотел вместо привязки непосредственно к модели, чтобы ViewModel подписывался и публиковал (или иным образом прокси) SourceList<MyThing> илипривязываемая версия этого, так что представление использует только свойства ViewModel.SourceList объявлен private в документах;Я не уверен в лучшей практике здесь: я делаю это общедоступным и делаю мои Connect() в ViewModel?Или есть способ передачи общедоступной IObservableCollection<MyThing> ThingsBindable из ViewModel?Я также не уверен, что ObservableCollectionExtended<MyThing> - правильный тип для свойства Bindable, но, похоже, он работает.

Я пробовал различные комбинации .ToProperty(), .Bind(), .Publish() и т. Д. И делал версию Обвязки вида, наблюдаемой в ViewModel, безрезультатно, и сейчас просто выбрасываю автозаполнение встена, чтобы увидеть, что торчит.Любое направление приветствуется.ТИА.

1 Ответ

3 голосов
/ 13 марта 2019

Я думаю, это было недоразумение для начинающих.Вот что у меня работает так, как я хочу;Может быть, это поможет другим новичкам Xamarin.iOS / ReactiveUI / DynamicData.

В моей модели я объявляю как личный SourceList, так и открытый для доступа IObservableList<MyThing>:

private readonly SourceList<MyThing> _ModelThings;
public IObservableList<MyThing> ModelThings;

Затем создаю их экземпляры в конструкторе:

_ModelThings = new SourceList<MyThing>();
ModelThings = _Things.AsObservableList();

В моей ViewModel я объявляю локальный ObservableCollectionExtended<MyThing> и привязываю его к общедоступному свойству модели:

public ObservableCollectionExtended<MyThing> ViewModelThings;

// Then, in the constructor:
ViewModelThings = new ObservableCollectionExtended<MyThing>();

model.ModelThings
    .Connect()
    .Bind(ViewModelThings)
    .Subscribe();

В моем ViewController я привязываю таблицу к ViewModel.ViewModelThings, как в вопросе.Если бы я хотел иметь другой уровень Модели, я мог бы просто пройти через Model.ModelThings и .Connect().Bind() вниз, как намекал Гленн в своем комментарии.

FWIW, я нашел Блог Роланда (в частности, разделы о наблюдаемых списках / кэшах), чтобы их было проще понять, чем документы GitHub.

...