🌊
Xamarin.FormsでEntryのフォーカスコントロール
この記事について
僕が今作っている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}"/>
IsFocusedSampleText
はReactiveProperty
です。
true, falseを切り替えることでフォーカス制御をコードビハインドに書かないで済みます。
Discussion