Mvvmcross(iOS) 绑定 UIViewController 的标题

9

是否可以将UIViewController的标题绑定到ViewModel字符串属性?它似乎从未更新。另外,如果在绑定之前没有设置标题,则在调用set.Apply()时会在Mvvmcross代码中崩溃。

UIViewController没有.xib文件,我不确定这是否是问题的一部分。

public override void ViewDidLoad()
{
  base.ViewDidLoad();

  var set = this.CreateBindingSet<HomeView, HomeViewModel>();
  set.Bind(Title).To(vm => vm.ProjectName);
  set.Apply();
}

以下是堆栈跟踪信息:

2014-02-05 17:09:35.740 TerraFlex[9145:907] 02-05-2014 17:09:35:7403 :1: [信息] HomeView已加载 线程已启动:#12 2014-02-05 17:09:36.219 TerraFlex[9145:907] 02-05-2014 17:09:36:2190 :1: [致命错误] 发生了严重错误,应用程序已关闭 2014-02-05 17:09:36.250 TerraFlex[9145:907] 02-05-2014 17:09:36:2497 :1: [致命错误] 日期: 5/02/2014 5:09:36 PM, [异常] 致命错误 消息: 对象的引用未设置到对象的实例 栈: at Cirrious.MvvmCross.Binding.Bindings.Target.Construction.MvxTargetBindingFactoryRegistry.TryCreateSpecificFactoryBinding (System.Object target, System.String targetName, IMvxTargetBinding& binding) [0x00001] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Bindings\Target\Construction\MvxTargetBindingFactoryRegistry.cs:69 at Cirrious.MvvmCross.Binding.Bindings.Target.Construction.MvxTargetBindingFactoryRegistry.CreateBinding (System.Object target, System.String targetName) [0x00001] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Bindings\Target\Construction\MvxTargetBindingFactoryRegistry.cs:22 at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.CreateTargetBinding (System.Object target) [0x00003] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Bindings\MvxFullBinding.cs:135 at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding..ctor (Cirrious.MvvmCross.Binding.MvxBindingRequest bindingRequest) [0x00014] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Bindings\MvxFullBinding.cs:60 at Cirrious.MvvmCross.Binding.Binders.MvxFromTextBinder.BindSingle (Cirrious.MvvmCross.Binding.MvxBindingRequest bindingRequest) [0x00001] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Binders\MvxFromTextBinder.cs:55 at Cirrious.MvvmCross.Binding.Binders.MvxFromTextBinder+<>c_DisplayClass1.b_0 (Cirrious.MvvmCross.Binding.Bindings.MvxBindingDescription description) [0x00000] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\Binders\MvxFromTextBinder.cs:37 at System.Linq.Enumerable+c__Iterator102[Cirrious.MvvmCross.Binding.Bindings.MvxBindingDescription,Cirrious.MvvmCross.Binding.Bindings.IMvxUpdateableBinding].MoveNext () [0x00000] in <filename unknown>:0 at Cirrious.MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBindings (IMvxBindingContextOwner view, IEnumerable1 bindings, System.Object clearKey) [0x00028] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\BindingContext\MvxBindingContextOwnerExtensions.cs:69 at Cirrious.MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBindings (IMvxBindingContextOwner view, System.Object target, IEnumerable1 bindingDescriptions, System.Object clearKey) [0x00019] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\BindingContext\MvxBindingContextOwnerExtensions.cs:90 at Cirrious.MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBinding (IMvxBindingContextOwner view, System.Object target, Cirrious.MvvmCross.Binding.Bindings.MvxBindingDescription bindingDescription, System.Object clearKey) [0x0000e] in c:\Projects\Misc\MVVMCROSS\Cirrious\Cirrious.MvvmCross.Binding\BindingContext\MvxBindingContextOwnerExtensions.cs:83 at Cirrious.MvvmCross.Binding.BindingContext.MvxBase 感谢您,Jon。

它似乎从来没有更新过。- 你可以编辑问题以显示你尝试了哪些代码? “在绑定之前,就会崩溃” - 你能编辑问题,显示这个“崩溃”的信息,并包括该“崩溃”的堆栈跟踪。我会尽力帮助。 - Stuart
明天我会发布崩溃日志,但代码基本上是这样的。 code public override void ViewDidLoad() { base.ViewDidLoad(); Title = "" // 先设置标题或者 set.Apply() 会崩溃 var set = this.CreateBindingSet(); set.Bind(Title).To(vm => vm.ProjectName); // 其他绑定 set.Apply() }code - user3264007
请“编辑问题”以提供完整信息,包括代码和堆栈跟踪。 - Stuart
1个回答

19

流畅的绑定使用类似如下代码:

 set
    .Bind(<target object for bind>)
    .For(<property on target object>) // leave this out to use the "default binding property for the target object"
    .To(<property/expression on source object>)
    .WithConversion(<converter>, <converter parameter>) // optional
    .OneWay() // optional - also: OneWayToSource(), TwoWay() or OneTime()
    .FallbackValue(<value to use for UnsetValue>(); // optional

您可以在以下链接中了解更多信息:


您的绑定是:

set.Bind(Title).To(vm => vm.ProjectName);

所以你正在进行绑定:

我猜你想要的是:

set.Bind(this).For(v => v.Title).To(vm => vm.ProjectName);

我认为你也可以这样做:

set.Bind().For(v => v.Title).To(vm => vm.ProjectName);

也就是说,Mvx堆栈本来不应该在有null的目标和属性时出现错误 - 以前它并没有 - 因此我会将此问题添加到调查列表中,并添加回归测试,以确定为什么TryCreateSpecificFactoryBinding无法处理null


1
不用道歉,很抱歉出现了崩溃而不是更有意义的错误信息!感谢您的报告 - 现在已经在Github问题中了。 - Stuart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接