MvvmCross を使用した MonoTouch プロジェクトがあります。コア プロジェクト コードをコンパイルできるところまで来ました (かなりの労力を要します)。現在、iOS 用のビューを作成しています。Xamarin ツールの最新の安定版リリースと MvvmCross を実行します。また、XCode 5 がインストールされた iOS7 SDK に対して実行しています。
まず、メイン ビュー モデルにテキスト フィールドをバインドする非常に基本的なビューを作成しました。ビュー内の関連コードは次のとおりです。
[Register("MainView")]
public partial class MainView : MvxViewController
{
public override void ViewDidLoad()
{
View = new UIView { BackgroundColor = UIColor.White };
base.ViewDidLoad();
var uiTextField = new UITextField(new RectangleF(0, 100, 320, 100));
Add(uiTextField);
this.CreateBinding(uiTextField).To<MainViewModel>(vm => vm.IsDebug).Apply();
}
}
ただし、バインディングは、次のスタック トレースで NullReference 例外をスローします。
1[MonoTouch.UIKit.UITextField].SourcePropertyPath[MainViewModel] (System.Linq.Expressions.Expression
System.NullReferenceException: オブジェクト参照が Cirrious.MvvmCross.Binding.BindingContext.MvxBaseFluentBindingDescription 1 sourceProperty) [0x00000] in :0 at Cirrious.MvvmCross.Binding.BindingContext.MvxFluentBindingDescriptionのオブジェクトのインスタンスに設定されていません1[MonoTouch.UIKit.UITextField].To[MainViewModel] (System.Linq.Expressions.Expression
1 sourceProperty) [0x00000] in :0 at ProjectX.Views.MainView.ViewDidLoad () [0x000a4] in /Users/jerriepelser/Development/1degree Software/ProjectX/Source/ProjectX.MonoTouch/Views/MainView.cs:26 at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend (intptr,intptr) at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible () [0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g .cs:129 at ProjectX.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication アプリ、MonoTouch.Foundation.NSDictionary オプション) [0x0003c] /Users/jerriepelser/Development/1degree Software/ProjectX/Source/ProjectX.MonoTouch/AppDelegate.cs :27 at at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 at ProjectX.Application.Main (System.String[] args) [0x00008] in /Users /jerriepelser/Development/1degree Software/ProjectX/Source/ProjectX.MonoTouch/Main.cs:16
バインディングの前にブレークポイントを設定すると、ViewModel がベース MvxViewController クラスで正しく設定されていることが確認できるので、ViewModel が設定されていなくても問題ありません。
また、データバインディングを行う次の方法も試しました。
var set = this.CreateBindingSet<MainView, MainViewModel> ();
set.Bind (uiTextField).To (vm => vm.IsDebug);
set.Apply ();
それでも NullReference 例外が発生しますが、次のスタック トレースがあります。
1[MonoTouch.UIKit.UITextField].SourcePropertyPath[MainViewModel] (System.Linq.Expressions.Expression
System.NullReferenceException: オブジェクト参照が Cirrious.MvvmCross.Binding.BindingContext.MvxBaseFluentBindingDescription 1 sourceProperty) [0x00000] in :0 at Cirrious.MvvmCross.Binding.BindingContext.MvxFluentBindingDescriptionのオブジェクトのインスタンスに設定されていません2[MonoTouch.UIKit.UITextField,OneLove.Core.ViewModels.MainViewModel].To (System.Linq.Expressions.Expression
1 sourceProperty) [0x00000] in :0 at OneLove.Views.MainView.ViewDidLoad () [0x000a6] in /Users/jerriepelser/Development/1degree Software/OneLove/Source/OneLove.MonoTouch/Views/MainView.cs:29 at at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend (intptr,intptr) at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible () [0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g .cs:129 at OneLove.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication アプリ、MonoTouch.Foundation.NSDictionary オプション) [0x0003c] /Users/jerriepelser/Development/1degree Software/OneLove/Source/OneLove.MonoTouch/AppDelegate.cs :27 at at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 at OneLove.Application.Main ( System.String[] args) [0x00008] in /Users/jerriepelser/Development/1degree Software/OneLove/Source/OneLove.MonoTouch/Main.cs:16
MvvmCross のデバッグ出力を見ても、何が問題なのかわかりません。何か案は?