2013-05-25 5 views
11

私のユーザーインターフェイスは一般的にローカライズされた文字列を必要とするので、ビューモデルはビューが消費するすべての文字列を提供します。これには、ボタンのタイトルなどが含まれます。流暢なバインディングとUIButtonのタイトル

iOS側では、ボタンタイトルはSetTitleメソッドで設定します。
ビューモデルの文字列=>ボタンのタイトルマッピングを機能させるために、MvvmCrossはこれをうまく機能させるためにいくつかの魔法のバインディング変換を行います。

私のビューにはFooというUIButtonがあり、そのタイトルをView ModelのプロパティButtonLabelにマップしたいとします。

this.AddBindings(new Dictionary<object, string>() { 
     {Foo, "Title ButtonTitle"} 
}); 

この同じ結合がMvvmCrossで流暢バインディングシステムを使用して設定することができます:例えば結合を設定するために、次の作品を知っているには?私はMvvmCrossソースから読んできましたが、私は結局バインディングコードを取得していません。

(実際にボタンがタイトルプロパティを持っていないので - それはのsetTitleメソッドを持っている)。この次は動作しません:

var set = this.CreateBindingSet<FooView, FooViewModel>(); 
set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle); 
set.Apply(); 

が流暢バインディングを使用して所望の結果を達成するためにそこに別の方法ですか?

答えて

27

ボタンは、タイトルproperyを持っていないので、その後、

set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle); 

はコンパイルされません。

しかし、Xamarin.iosのデフォルトMvvmCrossのconfiguratonは、カスタムはUIButtonと "タイトル" のために定義された結合持っています - 参照:登録されている

これにより、電話することができるはずです。

set.Bind(Foo).For("Title").To(vm => vm.ButtonTitle); 

として結合同じこのはずのセットアップ:強く結合ベースのコードが入力されhttps://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross

+0

ローカライズされた文字列については、ローカライズされた言語バインド機能を検討することもできます(https:// speakerdeckを参照)。com/cirrious/internationalization-in-mvvmcrossとhttp://slodge.blogspot.co.uk/2013/05/n21-internationalisation-i18n-n1-days.html – Stuart

+0

すごく面白いです。あなたは私の質問に答えてきました。 – Frank

+0

スチュアートも言及しています。「[このリンク](https://github.com/slodge/MvvmCross-Tutorials/blob/master/CustomBinding/CustomBinding.Droid/Setup.cs)を見ると、 'SpecialProperty'バインディングプロパティと 'HitThis'バインディングプロパティをシステムに追加する – Frank

1

MvvmCross 5.xの新しいバージョンでは:カスタムバインディングに非常に簡単に紹介するために

this.AddBindings(new Dictionary<object, string>() { 
    {Foo, "Title ButtonTitle"} 
}); 

見ますプロパティ。

彼らがそのように同じように行われています。

set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle); 

を使用してこれを追加していることを確認します

using MvvmCross.Binding.iOS; 

拡張プロパティの完全なリストは、ドキュメントhereで見つけることができるとthisはPRです変更が加えられました。