以前に Xamarin Form で XAML を使わず DataBinding する記事を書きました。
内容は特に何というわけでもなく、C# コードで UI を構築し DataBinding するものです。
今回はもう少し DataBinding を深堀して画面の要素間での Binding を指定してみます。
■ 結論
label.SetBinding(Label.TextProperty, new Binding("Text") { Source = editor, StringFormat = "{0} 円欲しい" });
この様に書くと Element 間で DataBinding が設定できます。
以降に XAML で書いた場合とコードで書いた場合の実例を書いてみます。
■ ViewModel
今回は画面の Element 間で Binding を行うため、ViewModel は必要ありません。
■ XAML
XAML で書いた場合です。Source に x:Reference で画面上の他の Element の Name を指定しています。何のこともない良くある Binding です。
<?xml version="1.0" encoding="UTF-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="CodeDataBinding.XamlElementBindingPage"> <StackLayout VerticalOptions="Center"> <Editor x:Name="editor"/> <Label Text="{Binding Text, Source={x:Reference editor}, StringFormat='{0} 円欲しい'}" /> </StackLayout> </ContentPage>
Editor の入力すると Label の Text に同じ値が表示されます。
■ コード
C# コードです。コードの下の方で Element 間の DataBinding を設定しています。
UI コントロールの生成部分が少し重いですが、今回の要点ではないので生成部分は読み飛ばして OK です。
using System; using Xamarin.Forms; namespace CodeDataBinding { public class CodeElementBindingPage : ContentPage { public CodeElementBindingPage() { Editor editor; Label label; Content = new StackLayout { VerticalOptions = LayoutOptions.Center, Children = { (editor = new Editor()), (label = new Label()) } }; label.SetBinding(Label.TextProperty, new Binding("Text") { Source = editor, StringFormat = "{0} 円欲しい" }); } } }
結果は XAML と同じなので省略します。
■ 得意な方法で開発を
XAML と C# のどちらで記述しても構いません。XAML の方が情報は多いですが、XAML が良くわからないというだけで Xamarin.Forms をあきらめてしまうのはもったいないです。
XAML がどうも手に合わないという方も、C# コードで Xamarin.Forms を継続してみてください。