Xamarin.FormsでEntryのフォーカスコントロール

1 min read読了の目安(約1100字

この記事について

僕が今作っているXamarin.Formsアプリではハードウェアキーボードでの作業が必須なので、
コントロールへのフォーカスを制御する必要がありました。
しかも、MVVMを少しでも守りたいという思いから調べに調べていました。
ButtonのIsEnabledと同じようにBindingも行いたかったのでそれも合わせて調べました。

使っているXamarin.Formsの機能

  • BindableProperty

作り方

以下のコードを書きます。

public class FocusExtension
{
	public static bool GetIsFocused(BindableObject obj)
	{
		return (bool) obj.GetValue(IsFocusedProperty);
	}

	public static void SetIsFocused(BindableObject obj, bool value)
	{
		obj.SetValue(IsFocusedProperty, value);
	}

	public static readonly BindableProperty IsFocusedProperty =
		BindableProperty.CreateAttached(
			"IsFocused",
			typeof(bool),
			typeof(FocusBehavior),
			false,
			propertyChanged: OnFocusedPropertyChanged);

	private static void OnFocusedPropertyChanged(BindableObject bindable, object oldValue, object newValue)
	{
		if (!(bindable is Entry entry))
		{
			return;
		}

		if ((bool)newValue)
		{
			entry.Focus();
		}
	}
}
<Entry
   ex:FocusExtensions.IsFocused="{Binding IsFocusedSampleText.Value, Mode=TwoWay}"
   Placeholder="何か入れてね"
   Text="{Binding SampleText.Value}"/>

IsFocusedSampleTextReactivePropertyです。
true, falseを切り替えることでフォーカス制御をコードビハインドに書かないで済みます。