如何使用 ReactiveUI 和 DynamicData 链接 SourceList 观察?
How do I chain SourceList observation using ReactiveUI and DynamicData?
如果术语不正确,我们深表歉意;我是一名 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();
我可以在我的视图中成功使用 .BindTo()
(即 iOS-land 中的 ViewController)让 UITableView 在模型更改时更新:
Model
.WhenAnyValue(model => model.ThingsBindable)
.BindTo<MyThing, MyThingTableViewCell>(
tableView,
new NSString("ThingCellIdentifier"),
46, // Cell height
cell => cell.Initialize());
我希望让 ViewModel 订阅并发布(或以其他方式代理)SourceList<MyThing>
或它的可绑定版本,而不是直接绑定到模型,以便 View仅使用 ViewModel 属性。 SourceList
在文档中被声明为 private
;我不确定这里的最佳实践:我是否在 ViewModel 中做到 public 和 Connect()
?或者有没有办法从 ViewModel 传递 publicly 公开的 IObservableCollection<MyThing> ThingsBindable
?我也不相信 ObservableCollectionExtended<MyThing>
是 Bindable 属性 的正确类型,但它似乎有效。
我尝试了 .ToProperty()
、.Bind()
、.Publish()
等的各种组合,并在 ViewModel 中制作了一个 View-binding Observable 版本,但无济于事,现在只需将自动完成功能扔到墙上,看看有什么粘住。任何方向表示赞赏。 TIA.
我觉得是初学者的误区。这就是我按照我想要的方式工作的东西;也许它会帮助其他 Xamarin.iOS/ReactiveUI/DynamicData 新手。
在我的模型中,我声明了私有 SourceList
和 publicly 公开 IObservableList<MyThing>
:
private readonly SourceList<MyThing> _ModelThings;
public IObservableList<MyThing> ModelThings;
然后在我的构造函数中实例化它们:
_ModelThings = new SourceList<MyThing>();
ModelThings = _Things.AsObservableList();
在我的 ViewModel 中,我声明了一个本地 ObservableCollectionExtended<MyThing>
并将其绑定到模型的 public 属性:
public ObservableCollectionExtended<MyThing> ViewModelThings;
// Then, in the constructor:
ViewModelThings = new ObservableCollectionExtended<MyThing>();
model.ModelThings
.Connect()
.Bind(ViewModelThings)
.Subscribe();
在我的 ViewController 中,我将 table 绑定到 ViewModel.ViewModelThings
,如问题所示。如果我想要另一个级别的模型,我可以简单地通过 Model.ModelThings
和 .Connect().Bind()
降低,正如 Glenn 在他的评论中暗示的那样。
FWIW,我发现 Roland's Blog(特别是关于 Observable Lists/Caches 的部分)比 GitHub 文档更容易理解。
如果术语不正确,我们深表歉意;我是一名 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();
我可以在我的视图中成功使用 .BindTo()
(即 iOS-land 中的 ViewController)让 UITableView 在模型更改时更新:
Model
.WhenAnyValue(model => model.ThingsBindable)
.BindTo<MyThing, MyThingTableViewCell>(
tableView,
new NSString("ThingCellIdentifier"),
46, // Cell height
cell => cell.Initialize());
我希望让 ViewModel 订阅并发布(或以其他方式代理)SourceList<MyThing>
或它的可绑定版本,而不是直接绑定到模型,以便 View仅使用 ViewModel 属性。 SourceList
在文档中被声明为 private
;我不确定这里的最佳实践:我是否在 ViewModel 中做到 public 和 Connect()
?或者有没有办法从 ViewModel 传递 publicly 公开的 IObservableCollection<MyThing> ThingsBindable
?我也不相信 ObservableCollectionExtended<MyThing>
是 Bindable 属性 的正确类型,但它似乎有效。
我尝试了 .ToProperty()
、.Bind()
、.Publish()
等的各种组合,并在 ViewModel 中制作了一个 View-binding Observable 版本,但无济于事,现在只需将自动完成功能扔到墙上,看看有什么粘住。任何方向表示赞赏。 TIA.
我觉得是初学者的误区。这就是我按照我想要的方式工作的东西;也许它会帮助其他 Xamarin.iOS/ReactiveUI/DynamicData 新手。
在我的模型中,我声明了私有 SourceList
和 publicly 公开 IObservableList<MyThing>
:
private readonly SourceList<MyThing> _ModelThings;
public IObservableList<MyThing> ModelThings;
然后在我的构造函数中实例化它们:
_ModelThings = new SourceList<MyThing>();
ModelThings = _Things.AsObservableList();
在我的 ViewModel 中,我声明了一个本地 ObservableCollectionExtended<MyThing>
并将其绑定到模型的 public 属性:
public ObservableCollectionExtended<MyThing> ViewModelThings;
// Then, in the constructor:
ViewModelThings = new ObservableCollectionExtended<MyThing>();
model.ModelThings
.Connect()
.Bind(ViewModelThings)
.Subscribe();
在我的 ViewController 中,我将 table 绑定到 ViewModel.ViewModelThings
,如问题所示。如果我想要另一个级别的模型,我可以简单地通过 Model.ModelThings
和 .Connect().Bind()
降低,正如 Glenn 在他的评论中暗示的那样。
FWIW,我发现 Roland's Blog(特别是关于 Observable Lists/Caches 的部分)比 GitHub 文档更容易理解。