rksoftware

Visual Studio とか C# とかが好きです

Xamarin Form で XAML を使わず画面の要素間での DataBinding を指定する

以前に 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 で書いた場合です。Sourcex: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 の入力すると LabelText に同じ値が表示されます。

■ コード

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 を継続してみてください。