如何使用ReactiveUI和DynamicData链接SourceList观察?

问题描述 投票:1回答:1

如果术语关闭,请道歉;我是iOS开发人员,不得不使用Xamarin.iOS开发应用程序。我正在使用带有DynamicData和MVVM架构的ReactiveUI。我对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();

我可以在我的View中成功使用.BindTo()(即iOS-land中的ViewController),以便在模型更改时更新UITableView:

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

我想,而不是直接绑定到Model,让ViewModel订阅和发布(或以其他方式代理)SourceList<MyThing>或其可绑定版本,以便View只使用ViewModel属性。 SourceList在文档中被宣布为private;我不确定这里的最佳做法:我是否公开并在ViewModel中做我的Connect()?或者有没有办法从ViewModel传递公开曝光的IObservableCollection<MyThing> ThingsBindable?我也不相信ObservableCollectionExtended<MyThing>是Bindable属性的正确类型,但它似乎有效。

我尝试了各种组合的.ToProperty().Bind().Publish()等,并在ViewModel中制作View-binding Observable的版本无济于事,我现在只是在墙上投掷自动完成功能,看看有什么棒。任何方向赞赏。 TIA。

ios xamarin.ios dynamic-data reactiveui xamarin.ios-binding
1个回答
3
投票

我认为这是初学者的误解。这就是我按照自己想要的方式工作的原因;也许它会帮助其他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>并将其绑定到Model的公共属性:

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,我发现Roland's Blog(特别是关于Observable Lists / Caches的部分)比GitHub文档更容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.