Data binding 当MvxCollectionViewSource';什么是数据变化?

Data binding 当MvxCollectionViewSource';什么是数据变化?,data-binding,xamarin.ios,mvvmcross,Data Binding,Xamarin.ios,Mvvmcross,我正在使用Xamarin和MVVMCross实现一个IOS应用程序。我正在处理的视图显示正确,但仅当我硬编码绑定到ViewModel内部的数据时,而不是当(出于设计和必要)我的数据从SQLite延迟到达时(仅在视图显示后的不确定时间) 到目前为止,我正在使用和完成的内容: 工作/显示具有UICollectionView的“我的视图”的情节提要 内部(在下面的代码中称为:CollectionView) 每个UICollectionViewCell的自定义布局和XIB文件也能在我的视图中正确显示

我正在使用Xamarin和MVVMCross实现一个IOS应用程序。我正在处理的视图显示正确,但仅当我硬编码绑定到ViewModel内部的数据时,而不是当(出于设计和必要)我的数据从SQLite延迟到达时(仅在视图显示后的不确定时间)

到目前为止,我正在使用和完成的内容:

  • 工作/显示具有UICollectionView的“我的视图”的情节提要 内部(在下面的代码中称为:CollectionView
  • 每个UICollectionViewCell的自定义布局和XIB文件也能在我的视图中正确显示
  • 仅当ViewModel数据在调用ViewDidLoad()时已完全填充时才能正常工作和显示的视图
问题:

  • 我的视图模型中的数据在不确定的时间内由模型数据库更新,同时视图正在愉快地显示。当我按如下所示绑定数据(并尝试双向/单向绑定等)时,我不会在视图上获得更新,因为最终数据稍后会出现
我似乎不能做的事情:

  • 重新绘制UICollectionView或刷新 MvxCollectionViewSource,以确保随着ViewModel数据的更改,我实际上可以重新绘制UICollectionView并显示我的 具有新数据和更新数据的自定义单元格
代码(TM)

CollectionView单元格的实现如下所示。我在网上和Stuart Bloke及其小猫的所有例子中都做了介绍,以确保我实现的所有模式都完全相同:

[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];
    }
}
[寄存器(“MyCell”)]
公共部分类MyCell:MvxCollectionViewCell
{
公共静态只读UINib Nib=UINib.FromName(“MyCell”,NSBundle.MainBundle);
public static readonly NSString Key=new NSString(“MyCell”);
公共迈塞尔(IntPtr手柄):底座(手柄)
{
这个.DelayBind(()=>{
var set=this.CreateBindingSet();
set.Bind(Label1.To)(item=>item.Label1);
set.Bind(Label2.To)(item=>item.Label2);
set.Apply();
});
}
公共静态MyCell Create()
{
返回(MyCell)Nib.Instantiate(null,null)[0];
}
}
视图中的My ViewDidLoad()如下所示:

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();
CollectionView.registernbforcell(MyCell.Nib,MyCell.Key);
var source=新的MvxCollectionViewSource(CollectionView,MyCell.Key);
CollectionView.Source=Source;
var set=this.CreateBindingSet();
set.Bind(source.To)(vm=>vm.listofsuff);
set.Apply();
CollectionView.ReloadData();
注意!上面显示的listofsuff实际上只是一个包含2个字符串的自定义类的列表

TL:DR:调用上述代码时,我不知道ListOfStuff的值。当我在ViewModel中硬编码它们时,我得到了乐趣。如果我不这样做,我就不会这样做,即使以后数据会正确更新


我现在向大家伸出双手,众包的大脑神经元…

而不是使用
列表
使用
可观察收集
,新项目应该添加到
收集视图

UI需要知道集合何时更改
ObservableCollection
实现
INotifyCollectionChanged
INotifyPropertyChanged
,并在集合更改时与UI通信

如果您使用的是
ObservableCollection
,您不应该再需要
ReloadData()

添加
IEnumerable

公共静态类ObservableCollectionExtensionMethod
{
公共静态void AddRange(此ObservableCollection源,IEnumerable集合)
{
foreach(集合中的var i)source.Add(i);
}
}

它似乎正在使用:source.reloadonalitemsourcesets=true;打电话!!!我之前也打过电话,但没用,但我认为当时我的单元格大小不正确,这些东西有时无法呈现任何东西,没有错误等等。非常感谢你的回复,Pilatus!我试试看:)
public static class ObservableCollectionExtensionMethod
{
    public static void AddRange<TSource>(this ObservableCollection<TSource> source, IEnumerable<TSource> collection)
    {
        foreach (var i in collection) source.Add(i);
    }
}