Xamarin.ios MVVMCross:ClearBindings()-如何在Touch中使用?
Xamarin.ios MVVMCross:ClearBindings()-如何在Touch中使用?,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,ClearBindings()如何在MvvmCross中工作 出于测试目的,我只是尝试在viewdiload()for WeekSelectorView中清除TableView的itemsSource。这是我尝试过的,但似乎没有任何效果 (“此”指的是我当前的WeekSelectorView实例) 上面的代码行可以工作,但我不想清除所有绑定,我只想清除TableView的ItemsSource 编辑: 我目前有一个WeekSelectorView,它与.xib关联。在.xib中有一个Table
ClearBindings()
如何在MvvmCross中工作
出于测试目的,我只是尝试在viewdiload()
for WeekSelectorView中清除TableView的itemsSource。这是我尝试过的,但似乎没有任何效果
(“此”指的是我当前的WeekSelectorView实例)
上面的代码行可以工作,但我不想清除所有绑定,我只想清除TableView的ItemsSource
编辑: 我目前有一个WeekSelectorView,它与.xib关联。在.xib中有一个TableView(在其他用户控件中) My WeekSelectorView将源设置为我自己的类“WeekSelectorTableSource”。此tablesource类根据ItemsSource绑定确定行/节的数量。然后在我的GetOrCreateCells中创建一些自定义的.xib单元格和
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
var weekSelectorCell = WeekSelectorCell.Create();
var set = _WeekSelectorView.CreateBindingSet<WeekSelectorView, WeekSelectorViewModel>();
//Using string bindings since bindings with an index doesn't work
//ex: vm => vm.Options[indexPath.Row].Title
set.Bind(weekSelectorCell).For(wc => wc.Title).To(string.Format("{0}{1}{2}", Options, indexPath.Row, Title)).OneWay();
set.Bind(weekSelectorCell).For(wc => wc.Date).To(string.Format("{0}{1}{2}", Options, indexPath.Row, DateString)).OneWay();
set.Bind(weekSelectorCell).For(wc => wc.Hours).To(string.Format("{0}{1}{2}", Options, indexPath.Row, TotalHours)).WithConversion(new HoursDecimalToHoursMinutesConverter(), null).OneWay();
set.Apply();
return weekSelectorCell;
}
在重新加载表后,我收到了大量的此消息,因此我想在每次执行TableView.ReloadData()
之前清除绑定
编辑: 经过仔细考虑并与一位使用Windows本机绑定的同事交谈后,我发现我有很多地方做错了,长话短说,我不需要使用
ClearBindings(view)
我让我的最外面的视图处理所有绑定,因此当视图被重新加载(即表中的单元格)时,绑定仍然存在,因为最外面的视图没有被释放。因此,我所有的子视图都从未处理过自己的绑定,这是一个重大错误
为了解决这个问题(按照我想象的“正确”方式),我让我的自定义单元格从MvxTableViewCell继承,并添加了一个延迟绑定
public WeekSelectorCell (IntPtr handle) : base (handle)
{
this.DelayBind (() =>
{
var set = this.CreateBindingSet<WeekSelectorCell, WeekViewModel>();
set.Bind(DateLabel).For(lbl => lbl.Text).To(vm => vm.DateString);
set.Bind(HoursLabel).For (lbl => lbl.Text).To(vm => vm.TotalHours).WithConversion(new HoursDecimalToHoursMinutesConverter(), null);
set.Bind(TitleLabel).For(lbl => lbl.Text).To(vm => vm.Title);
set.Apply();
});
}
publicWeekSelectorCell(IntPtr句柄):基本(句柄)
{
this.DelayBind(()=>
{
var set=this.CreateBindingSet();
set.Bind(DateLabel).For(lbl=>lbl.Text).To(vm=>vm.DateString);
set.Bind(HoursLabel).For(lbl=>lbl.Text).To(vm=>vm.TotalHours).WithConversion(new HoursDecimalToHoursMinutesConverter(),null);
set.Bind(TitleLabel).For(lbl=>lbl.Text).To(vm=>vm.Title);
set.Apply();
});
}
我以前尝试过此操作,但尝试在
和尝试访问(vm=>vm.Options[ROW].Date)之间创建一个集合,但始终失败。我终于学会了我需要在
之间创建一个集合,因为Options[]
是WeekViewModel
正如我所说,长话短说,我不需要使用ClearBindings(view)
ClearBindings()在MvvmCross中是如何工作的
ClearBindings()
是ClearBindings(视图)
每个MvxBindingContext
维护3个单独的“绑定”列表:
DataContext=value
MvxBindingContext
为该列表公开的唯一公共ClearAPI是ClearAll
第二个仅在Android中用于一些子视图Xml膨胀,并且ClearBindings(view)
允许使用这些子视图Xml膨胀
所有这些背后的历史尤其与Android和iOS内存管理的许多问题有关,尤其是试图确保我们跟踪并处理了所有绑定,包括在子视图、列表中创建的绑定,等等
如果我们能在这里挖掘出一个好的用例——从“这只是为了一些测试目的”中稍微扩展一下-那么一个
ClearBindingsRobject
或EnumerateBinding
API将是扩展绑定上下文API可以考虑的东西-但它肯定需要更高的要求,以确保项目捕获API真正有用的内容
同时,我想如果您愿意,您可以使用tableView作为查找来创建和注册绑定,例如:
var bindings = MvxBindingSingletonCache.Instance.Binder.Bind(BindingContext.DataContext, tableView, "ItemsSource MySource");
this.RegisterBindingsFor(tableView, bindings);
这将使您能够调用ClearBindings(tableView)代码>
或者,如果您想停止单个绑定的工作,则可以Dispose
early-这将清除它的源绑定-例如,如果您这样做了:
_myDisposableBindings = MvxBindingSingletonCache.Instance.Binder.Bind(BindingContext.DataContext, tableView, "ItemsSource MySource");
this.AddBindings(_myDisposableBindings);
然后你可以在以后的某个时候做一些事情,比如:
foreach (var binding in _myDisposableBindings)
{
binding.Dispose();
}
_myDisposableBindings = null;
或者-也许这就是我的方法(尽管这完全取决于您的用例是什么)-然后将您的表放在它自己的MvxView
控件中可能会更容易-它可以有自己的BindingContext
,您可以调用ClearAllBindings()
有关MvxView
的更多信息,请参阅
最后,我也可以考虑是否可以将绑定保持在适当的位置,但是可以在视图模型中清除<代码> ItaseStase<代码>。
真正被这个主题迷住了-已经创建了后续问题-我主要是考虑动态UIS,但也对清除静态控件绑定的这一领域感兴趣(只是不太了解用例),感谢您的长篇大论-非常有用。。。我仍然认为在其他情况下,删除绑定可能会很有用(这是droidClearBindings(view)
方法的初衷-因此这可能很快会出现在iOS版本中!感谢您的帮助:)
var bindings = MvxBindingSingletonCache.Instance.Binder.Bind(BindingContext.DataContext, tableView, "ItemsSource MySource");
this.RegisterBindingsFor(tableView, bindings);
_myDisposableBindings = MvxBindingSingletonCache.Instance.Binder.Bind(BindingContext.DataContext, tableView, "ItemsSource MySource");
this.AddBindings(_myDisposableBindings);
foreach (var binding in _myDisposableBindings)
{
binding.Dispose();
}
_myDisposableBindings = null;