如果术语关闭,请道歉;我是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。
我认为这是初学者的误解。这就是我按照自己想要的方式工作的原因;也许它会帮助其他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文档更容易理解。