Data binding 当MvxCollectionViewSource';什么是数据变化?
我正在使用Xamarin和MVVMCross实现一个IOS应用程序。我正在处理的视图显示正确,但仅当我硬编码绑定到ViewModel内部的数据时,而不是当(出于设计和必要)我的数据从SQLite延迟到达时(仅在视图显示后的不确定时间) 到目前为止,我正在使用和完成的内容:Data binding 当MvxCollectionViewSource';什么是数据变化?,data-binding,xamarin.ios,mvvmcross,Data Binding,Xamarin.ios,Mvvmcross,我正在使用Xamarin和MVVMCross实现一个IOS应用程序。我正在处理的视图显示正确,但仅当我硬编码绑定到ViewModel内部的数据时,而不是当(出于设计和必要)我的数据从SQLite延迟到达时(仅在视图显示后的不确定时间) 到目前为止,我正在使用和完成的内容: 工作/显示具有UICollectionView的“我的视图”的情节提要 内部(在下面的代码中称为:CollectionView) 每个UICollectionViewCell的自定义布局和XIB文件也能在我的视图中正确显示
- 工作/显示具有UICollectionView的“我的视图”的情节提要 内部(在下面的代码中称为:CollectionView)
- 每个UICollectionViewCell的自定义布局和XIB文件也能在我的视图中正确显示
- 仅当ViewModel数据在调用ViewDidLoad()时已完全填充时才能正常工作和显示的视图
- 我的视图模型中的数据在不确定的时间内由模型数据库更新,同时视图正在愉快地显示。当我按如下所示绑定数据(并尝试双向/单向绑定等)时,我不会在视图上获得更新,因为最终数据稍后会出现
- 重新绘制UICollectionView或刷新 MvxCollectionViewSource,以确保随着ViewModel数据的更改,我实际上可以重新绘制UICollectionView并显示我的 具有新数据和更新数据的自定义单元格
[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);
}
}