2016-07-18 2 views
1

IOS 응용 프로그램을 구현하기 위해 Xamarin과 MVVMCross를 사용하고 있습니다. 내가 일하고 있어요 뷰는 제대로 표시되지만, ONLY 때 데이터가 내 ViewModel에 내부와하지에 결합되는 하드 코딩 할 때 내 데이터 뷰 후, SQLite는에서 후반에만 불확실한 시간을 도착 (디자인과 필요에 의해 등) 가 표시됩니다.MvxCollectionViewSource의 데이터가 변경 될 때 어떻게 UICollectionView를 다시 그립니다.

  • 작업 UICollectionView을 가지고 내보기에 /보기 스토리 보드 내부 (전화 : 아래 코드에서 CollectionView)
  • 사용자 정의 레이아웃과 내가 사용하고 지금까지 성취하고 무엇

    대한 XIB 파일의 모든 또한 내보기에 올바르게 경우에만 제대로 작동 및 디스플레이

  • 뷰를 표시 UICollectionViewCell의 ViewModel 다 ta는 ViewDidLoad()이 호출 될 때 완전히 채워집니다.

문제 : 뷰가 행복하게 표시되는 동안 내 뷰 모델에서

  • 내 데이터는 시간의 불확실한 양 모델의 데이터베이스에서 업데이트됩니다. 나는 아래 (양방향/단방향 바인딩을 시도하고,뿐만 아니라 같은)로 데이터를 바인딩 할 때 최종 데이터 나중에 오면, 나는 내보기에 업데이트를하지 않습니다.

내가 할 수없는 것 무엇 :

  • 내가 실제로 을 다시 그릴 수 있으며, 뷰 모델의 데이터의 변경을 보장하기 위하여 MvxCollectionViewSource 아래를 새로 어쩌면 UICollectionView 다시 그리기 또는 UICollectionView와 신규 및 업데이트 된 데이터 내 사용자 정의 세포를 보여줍니다.

하는 코드 (TM)

다음 세포 구현되는 CollectionView. 나는 온라인으로 모든 예제를 따라하고 스튜어트 놈과 그의 새끼 고양이에서 나는 정확히 같은 모든 패턴을 구현할 수 있는지 확인 :

CollectionView.RegisterNibForCell(MyCell.Nib, MyCell.Key); 
var source = new MvxCollectionViewSource(CollectionView, MyCell.Key); 
CollectionView.Source = source; 

var set = this.CreateBindingSet<MyView, MyViewModel>(); 
set.Bind(source).To(vm => vm.ListOfStuff); 
set.Apply(); 

CollectionView.ReloadData(); 
:
[Register("MyCell")] 
public partial class MyCell : MvxCollectionViewCell 
{ 
    public static readonly UINib Nib = UINib.FromName("MyCell", NSBundle.MainBundle); 
    public static readonly NSString Key = new NSString("MyCell"); 

    public MyCell(IntPtr handle) : base(handle) 
    { 
     this.DelayBind(() => { 
      var set = this.CreateBindingSet<MyCell, SomeModelClass>(); 
      set.Bind(Label1).To(item => item.Label1); 
      set.Bind(Label2).To(item => item.Label2); 
      set.Apply(); 
     }); 
    } 

    public static MyCell Create() 
    { 
     return (MyCell)Nib.Instantiate(null, null)[0]; 
    } 
} 

보기에 내 의 viewDidLoad()

이 같이 보입니다

NB! 위에 표시된 ListOfStuff 정말 지금이 문자열을 포함하는 사용자 정의 클래스의 단지 목록입니다.

TL : DR : 나는 ListOfStuff의 값 나는 위의 코드를 호출하는 순간을 모른다. ViewModel에서 코드를 하드 코딩하면 기쁨을 얻습니다. 그렇지 않으면 나중에 데이터가 올바르게 업데이트 되더라도 그렇지 않습니다.

지금은 List<T> 사용 ObservableCollection<T>를 사용하는 대신에 ... 크라우드 소싱의 뇌의 뉴런, 당신에게

+0

의 범위를 추가 할 때

이 확장 방법으로 작동하는 유용 할 수 있습니다 – user757410

+0

source.ReloadOnAllItemsSourceSets = TRUE; !!! 이전에 너무 불렀지 만 작동하지 않았지만 셀 크기가 잘못되었다고 생각합니다. 이러한 것들은 실수없이 오류를 렌더링하지 못합니다. – user757410

답변

0

을 도달하고 새 항목은 CollectionView에 추가해야합니다.

UI는 컬렉션이 변경된시기를 알아야합니다. ObservableCollection<T>INotifyCollectionChangedINotifyPropertyChanged을 구현하며 컬렉션이 변경되면 UI와 통신합니다.

ObservableCollection<T>을 사용하는 경우 더 이상 ReloadData()이 필요하지 않습니다. IEnumerable<T>

public static class ObservableCollectionExtensionMethod 
{ 
    public static void AddRange<TSource>(this ObservableCollection<TSource> source, IEnumerable<TSource> collection) 
    { 
     foreach (var i in collection) source.Add(i); 
    } 
} 
것 같다
+0

Pilatus! 답장을 보내 주셔서 감사합니다. 나는 그것을 줄 것이다 :) – user757410

관련 문제