Mvvmcross(iOS)绑定UIViewController的标题

Mvvmcross(iOS) binding the Title of UIViewController

是否可以将UIViewController的Title绑定到ViewModel字符串属性? 它似乎从未更新。 作为附带的问题,如果在绑定之前尚未将标题设置为某些内容,则在调用set.Apply()时,Mvvmcross代码会崩溃。

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

1
2
3
4
5
6
7
8
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: [Info] HomeView loaded
Thread started: #12
2014-02-05 17:09:36.219 TerraFlex[9145:907] 02-05-2014 17:09:36:2190 :1: [Fatal] A critical error occurred and the application was closed
2014-02-05 17:09:36.250 TerraFlex[9145:907] 02-05-2014 17:09:36:2497 :1: [Fatal] Date: 5/02/2014 5:09:36 PM, [Exception]
Fatal
Message: Object reference not set to an instance of an object
Stack: 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 :0
at Cirrious.MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBindings (IMvxBindingContextOwner view, IEnumerable
1 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.MvxBaseFluentBindingDescription
1[System.String].Apply () [0x00000] in :0
at Cirrious.MvvmCross.Binding.BindingContext.MvxFluentBindingDescriptionSet`2[Trimble.TFM.FieldApp.HomeView,Trimble.TFM.FieldApp.Common.HomeViewModel].Apply () [0x00000] in :0

谢谢,
乔恩


流利的绑定使用如下代码:

1
2
3
4
5
6
7
 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

您可以在以下位置了解更多信息:

  • https://github.com/MvvmCross/MvvmCross/wiki/Databinding#wiki-fluent

您的绑定是:

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

因此,您具有约束力:

  • .Bind(Title)-当前Title对象中的任何内容(通常为null)
  • 有关该对象的默认绑定属性如何-取决于对象类型-请参见https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Touch/MvxTouchBindingBuilder.cs #L104为基本列表
  • 到DataContext(通常是ViewModel)上的ProjectName

我想您想要的是:

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

我认为您也可以这样做:

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

话虽如此,Mvx堆栈实际上不应该因为拥有null目标和属性而被否决-它以前从未这样做过-因此我将把它作为一个问题来研究并添加一个回归测试,以说明为什么无法处理null