2017-01-09 1 views
0

ReactiveUI를 사용하는 앱에서 몇 가지 작업을 해왔습니다.UITableViewCells에서 바인딩을 처리하는 방법

제 문제는 UITableViews와 셀 재사용입니다. ReactiveTableViewSource를 사용해 보았지만 원하는 커스터마이징 레벨 (사용자 정의 헤더 및 푸터 뷰)을 제공하지 못하는 것 같습니다.

그래서 UITableViewSource 및 UITableViewCell을 사용하고 IViewFor를 구현했습니다. 그런 다음 각 세포에서 결합을 수행했습니다.

잘 작동하지만 셀을 다시 사용할 때마다 새로운 ViewModel에 "다시 바인딩"할까봐 걱정됩니다. 나는 내가 그 주변에서 일했다고 믿지만, 나는 그것을 할 수있는 더 좋은 방법이 있다고 확신한다. 내가 사용


코드 (단지 관련 비트) :

public partial class FlavourTableViewCell : UITableViewCell, IViewFor<MenuItemViewModel.FlavourSetItemViewModel> 
{ 
    public MenuItemViewModel.FlavourSetItemViewModel ViewModel { get; set; } 
    object IViewFor.ViewModel { get { return ViewModel; } set { ViewModel = (MenuItemViewModel.FlavourSetItemViewModel)value; } } 

    List<IDisposable> bindings = new List<IDisposable>(); 

    // Called when new data should be shown in cell 
    internal void Update (MenuItemViewModel.FlavourSetItemViewModel data, MenuItemViewModel.FlavourSelectionEnum type) 
    { 
     ViewModel = data; 

     // Clear old bindings 
     if (bindings.Any()) { 
      bindings.ForEach (x => x.Dispose()); 
      bindings.Clear(); 
     } 

     bindings.Add (this.Bind (ViewModel, x => x.IsSelected, view => view.SelectionButton.Selected)); 
    } 
} 

추가 정보 :

FlavourSetItemViewModelFlavourSetItemViewModel의 목록이 포함되어 있습니다. 나는 아래에 설명하려고합니다 :

  • FlavourSetItemViewModel을 - 섹션 이름을
    • FlavourSetItemViewModel을 가지고 - 항목 이름을
    • FlavourSetItemViewModel을 가지고 - 항목 이름을
    • FlavourSetItemViewModel을 가지고 - 항목 이름을
    • FlavourSetItemViewModel을 가지고 - 상품명이 있습니다
  • 풍미 etItemViewModel은 - 섹션 이름을
    • FlavourSetItemViewModel을 가지고 - 항목 이름을 가지고

답변

1

당신이 나에게 잘못 보이지 않는 일을하고 있습니다. 개선 할 수있는 것은 IDisposable 목록 대신 CompositeDisposable을 사용하는 것입니다.

그러나 직접 구현을 사용하고 GetViewForHeader을 재정 의하여 고유 한 헤더보기를 제공하여 ReactiveTableViewSource을 사용해 볼 수도 있습니다.

그런 다음 사용자 정의 테이블 뷰 소스에 데이터를 바인딩 할 수 있습니다 :

this.WhenAnyValue (view => view.ViewModel.TableSections) 
    .Select (tableData => tableData.Select (section => new TableSectionInformation<TModel, TReactiveTableViewCell> (section, "cellIdentifier", 44)).ToArray()) 
    .BindTo (tableViewSource, x => x.Data); 

TableData 가정 :

this.WhenAnyValue (view => view.ViewModel.Section1, view => view.ViewModel.Section2, (section1, section2) => new TableSectionInformation<TModel> [] { 
    new TableSectionInformation<TModel, TReactiveTableViewCell> (section1, "section1cell", 44), 
    new TableSectionInformation<TModel, TReactiveTableViewCell> (section2, "section2cell", 44) 
}) 
.BindTo (tableViewSource, x => x.Data); 

당신이 섹션의 동적 양을 사용하는 경우, 당신은 다음을 수행 할 수 일종의 2 차원 목록입니다.

내 표본이 목록에 대한 변경 사항을 고려하지 않도록주의하십시오. 속성 (TableSections) 자체 만 변경합니다.

+0

이것은 유망 해 보입니다. 그러나 나는 동적 인 섹션을 가지고있다. 그 어떤 힌트라도? – angak

+0

답변에 추가했습니다. – Qonstrukt

+0

분명히 내 모든 뇌 세포가 오늘 일하는 것은 아닙니다. 'TableSectionInformation' 구현에 대해 자세히 설명해 주시겠습니까? – angak

관련 문제