Xamarin.ios 如何处理UITableViewCells中的绑定

Xamarin.ios 如何处理UITableViewCells中的绑定,xamarin.ios,reactiveui,Xamarin.ios,Reactiveui,我一直在使用ReactiveUI开发一个应用程序 我的问题是UITableView和单元格的重用。我尝试使用ReactiveTableViewSource,但这似乎没有给我想要的自定义级别(自定义页眉和页脚视图) 所以我使用UITableViewSource和UITableViewCell并实现了IViewFor。 然后我在单个细胞中进行了结合 这很好,但我担心每次重用单元格时都会“重新绑定”到新的ViewModel。我相信我已经解决了这个问题,但我相信有更好的方法 我正在使用的代码(仅相关位

我一直在使用ReactiveUI开发一个应用程序

我的问题是UITableView和单元格的重用。我尝试使用ReactiveTableViewSource,但这似乎没有给我想要的自定义级别(自定义页眉和页脚视图)

所以我使用UITableViewSource和UITableViewCell并实现了IViewFor。 然后我在单个细胞中进行了结合

这很好,但我担心每次重用单元格时都会“重新绑定”到新的ViewModel。我相信我已经解决了这个问题,但我相信有更好的方法


我正在使用的代码(仅相关位):

公共部分类FlavourTableViewCell:UITableViewCell,IViewFor { 公共菜单ItemViewModel.FlavourSetItemViewModel视图模型{get;set;} object IViewFor.ViewModel{get{return ViewModel;}set{ViewModel=(MenuItemViewModel.FlavourSetItemViewModel)值;} 列表绑定=新列表(); //当新数据应显示在单元格中时调用 内部无效更新(MenuItemViewModel.FlavourSetItemViewModel数据,MenuItemViewModel.FlavourseSelectionEnum类型) { ViewModel=数据; //清除旧绑定 if(bindings.Any()){ bindings.ForEach(x=>x.Dispose()); bindings.Clear(); } 添加(this.Bind(ViewModel,x=>x.IsSelected,view=>view.SelectionButton.Selected)); } }
其他信息:

FlavourSetItemViewModel
包含
FlavourSetItemViewModel
的列表。我将试着解释如下:

  • FlavourSetItemViewModel-具有节名
    • FlavourSetItemViewModel-具有项目名称
    • FlavourSetItemViewModel-具有项目名称
    • FlavourSetItemViewModel-具有项目名称
    • FlavourSetItemViewModel-具有项目名称
  • FlavourSetItemViewModel-具有节名
    • FlavourSetItemViewModel-具有项目名称

    • 在我看来,你所做的并没有错。您可以改进的是使用
      CompositeDisposable
      而不是
      IDisposable
      列表

      但您也可以尝试使用
      ReactiveTableViewSource
      ,方法是使用自己的实现,然后覆盖
      GetViewForHeader
      以提供自己的头视图

      然后,可以将数据绑定到自定义表视图源:

      this.whenyValue(view=>view.ViewModel.Section1,view=>view.ViewModel.Section2,(Section1,Section2)=>newtablesectioninformation[]{
      新表节信息(第1节,“第1节单元格”,44),
      新表节信息(第2节,“第2节单元格”,44)
      })
      .BindTo(tableViewSource,x=>x.Data);
      
      如果您使用的是动态数量的分区,则可以执行以下操作:

      this.whenyValue(视图=>view.ViewModel.TableSections)
      .Select(tableData=>tableData.Select(section=>newtablesectioninformation(section,“cellIdentifier”,44)).ToArray())
      .BindTo(tableViewSource,x=>x.Data);
      
      假设
      TableData
      是一个二维排序列表


      请注意,在我的示例中,不考虑对列表的更改。仅更改属性(表分区)本身。

      这看起来很有希望。但我有一个动态的部分数量。有什么提示吗?我在答案中加了这个。显然今天我的脑细胞不是都在工作。请详细说明
      表节信息
      的实现方式好吗?您可以使用提供的
      表节信息
      的实现方式。这只是为
      ReactiveTableViewSource
      提供正确数据的一种方法。您可以创建自己的
      ReactiveTableViewSource
      实现,以便能够覆盖
      GetViewForHeader
      等方法。或者能够使用动态行高度,例如。只是别忘了用正确的实际类型替换我示例中的所有泛型类型。例如
      TReactiveTableViewCell
      是您的自定义
      ReactiveTableViewCell
      类和
      TModel
      该单元格在其
      IViewFor
      界面中的视图模型。您能看看这个要点并告诉我有什么问题吗?我得到一个System.Reflection.TargetException(非静态方法需要一个目标)。这可能很简单,但我就是看不到