ReactiveTableViewSource

ReactiveTableViewSource

在我们的应用程序中,我们使用ReactiveUI遵循MVVM模式。在一个 View 中,我们想要显示一个UITableView。数据通常传递给UITableView.Source,但是在ReactiveUI中,我们使用ReactiveTableViewSource<TSource>

我不了解的是如何将在 View 模型中从ReactiveList中获得的数据绑定(bind)到ReactiveTableViewSource中。

现在,我们在UIView内创建一个表,如下所示:

Table = new UITableView(UIScreen.MainScreen.Bounds);
Table.Source = new TableSource(Table, MyReactiveList, (NSString) CellIdentifier, _cellHeight, cell => Debug.WriteLine(cell));

顺便说一句:细胞作用是用来做什么的?

此外,我们还有一个Table源类,如下所示:
internal sealed class TableSource : ReactiveTableViewSource<MyListObject>
{
  public TableSource(UITableView tableView, IReactiveNotifyCollectionChanged<MyListObject> collection, NSString cellKey, float sizeHint, Action<UITableViewCell> initializeCellAction = null) : base(tableView, collection, cellKey, sizeHint, initializeCellAction)

在我的 View 模型中,我有一个更新我的ReactiveList的服务。看起来像这样:
public sealed class MyService : ReactiveObject, IMyService
{
  public IReactiveList<MyListObject> MyReactiveList { get; }

  public async Task UpdateMyReactiveListAsync() {//...}

我在哪里将表源绑定(bind)到ReactiveList?我在哪里订阅 Activity ?我可能错过了任何文档或示例代码吗?

最佳答案

使用ReactiveTableViewSource很容易:

只需将List与UITableView连接

var tableView = new UITableView ();

// Bind the List agains the table view
// SampleObject is our model and SampleCell the cell
ViewModel.WhenAnyValue (vm => vm.Items).BindTo<SampleObject, SampleCell> (tableView, 46, cell => cell.Initialize());

然后创建一个自定义单元,将模型数据绑定(bind)到该单元。
public class SampleCell : ReactiveTableViewCell, IViewFor<SampleObject>
{
    public SampleCell () : base() { }
    public SampleCell (IntPtr handle) : base(handle) { }

    private SampleObject _viewModel;
    public SampleObject ViewModel
    {
        get { return _viewModel; }
        set { this.RaiseAndSetIfChanged (ref _viewModel, value); }
    }

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = value as SampleObject; }
    }

    public void Initialize()
    {
        this.WhenAnyValue (v => v.ViewModel.Name).BindTo (
            this,
            v => v.TextLabel.Text);
    }
}

您可以在这里找到一个引人注目的示例:https://github.com/reicheltp/ReactiveTableViewSource-Sample

更新2016/03/09:最好在单独的Initialize方法中进行绑定(bind),以防止多次调用。

如果您还有其他问题,可以在Twitter上提问:@reicheltp

10-06 15:13