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个单独的“绑定”列表:

  • 直接在上下文上创建的绑定列表
  • 在子视图中创建的绑定的基于视图的查找表-当前只有在父绑定上下文中动态扩展子视图时,才会在Android绑定中使用这些表
  • 等待第一次调用
    DataContext=value
  • 其中第一个是目前在iOS中使用的主要API,
    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,但也对清除静态控件绑定的这一领域感兴趣(只是不太了解用例),感谢您的长篇大论-非常有用。。。我仍然认为在其他情况下,删除绑定可能会很有用(这是droid
    ClearBindings(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;