xamarin+mvvmcross のあれこれ
TRANSCRIPT
Xamarin + MVVMCross
のあれこれ
第 5 回 Japan Xamarin User Group Conference 大阪2015/07/11
青柳臣一 @ShinichiAoyagi
自己紹介 青柳臣一
@ShinichiAoyagi
職業 : ソフトウエア開発(大阪 淀屋橋) Xamarin + ASP.NET MVC/Web API ( C# ) + WPF ( C# ) WPF ( C# )、 Windows Froms ( VB ) iOS ( Objective-C )、 Android ( Java )
MVVMCross
MVVM をサポートするライブラリ https://github.com/MvvmCross/MvvmCross
MVVM 以外にも便利な機能あり
Xamarin 専用というわけではない
MVVM
Model – View - ViewModel 「見た目」と「データ」と「連結部」
ビューiOS
ビューWinPhon
e
ビューAndroid
ビューWPF
ビューモデル モデル
MVVMCross を使いはじめる NuGet でインストール
全部のプロジェクトに ちょっと修正
App1.Core → App1 iOS
AppDelegate.cs 変更 Main.storyboard を消す
Android MainActivity.cs を消す
Windows Phone App.xaml.cs を変更
MVVMCross の起動の流れ iOS
AppDelegate.cs → Setup.cs → Core.App.cs
Android SplashScreen ( MainLauncher=true ) → Setup.cs →
Core.App.cs
Windows Phone App.xaml.cs → Setup.cs → Core.App.cs
どれも最後は Mvx.Resolve<IMvxAppStart>().Start()
がんばってる
データバインディング ビューモデル
MvxViewModel を継承する
XAML で書くときと同じ INotifyPropertyChanged で変更通知
private string hello = "Hello MvvmCross";public string Hello{ get { return this.hello; } set { this.hello = value; RaisePropertyChanged(() => this.Hello); }}
public IMvxCommand ClickCommand{ get { return new MvxCommand(() => { this.Hello = "Click!"; }); }}
データバインディング .iOS
コードで書く using Cirrious.MvvmCross.Binding.BindingContext; インテリセンスのおかげで悪くはない
Set.Bind(control).For(c => c.Text).To(vm => vm.Hello).WithConversion(…);
var set = this.CreateBindingSet<FirstView, App1.ViewModels.FirstViewModel>();set.Bind(label).To(vm => vm.Hello);set.Bind(textField).To(vm => vm.Hello);set.Bind(button).To(vm => vm.ClickCommand);set.Apply();
データバインディング .Droid
axml に書く
<EditText ~略~ local:MvxBind="Text Hello" /><TextView ~略~ local:MvxBind="Text Hello" /><Button ~略~ local:MvxBind="Click ClickCommand"/>
Color プラグイン NuGet でプラグインを入れる
これも全部のプロジェクトに ViewModel
MvxColor を使う View
データバインド + ValueConverter iOS: set.Bind(label)
.For(c => c.TextColor).To(vm => vm.LabelColor)
.WithConversion(new MvxNativeColorValueConverter());
Android: local:MvxBind="Text Hello; TextColor NativeColor(LabelColor)“
XAML: Color="{Binding CurrentColor, Converter={StaticResource NativeColor}}"
set.Bind(label).For(c => c.TextColor).To(vm => vm.LabelColor).WithConversion(new MvxNativeColorValueConverter());
プラグイン (2)
コードでよく使うのにプラットフォームで違うものたち ブラウザー起動
メール起動 ファイルアクセス Sqlite
その他にもいろいろ https://
github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins
Mvx.Resolve<IMvxWebBrowserTask>().ShowWebPage("http://yahoo.co.jp/");
MvxViewModel
ビューの遷移 ShowViewModel<TViewModel>(new { id = “..”, flag = true });
ViewModel でpublic void Init(string id, bool flag){
…
Mvx の IoC
基本 登録 : Mvx.RegisterSingleton<IFoo>(new Foo()); 参照 : Mvx.Resolve<IFoo>().Bar();
Cirrious.CrossCore.IoC.MvxTypeExtensions https://
github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control
プラグインはこの仕組み
MVVMCross の闇 iOS のストーリーボードは?
MvxTouchViewsContainer を継承してごにょごにょすればできた
モーダルなウインドウは? ViewPresenter とかごにょごにょすればできた
Xamarin.Forms は? Setup.cs とか MvxViewModelViewTypeFinder とか
ViewPresenter とかいろんなものをごにょごにょすればできた
MVVMCross
わかりにくいところもあるけど便利なところもおおいよ(個人の感想です)