前回の記事ではEntryの文字の色を変えるところまでやりました。今回はそれに加えてボタンと連携し、条件を満たす文字列の場合にのみボタンが有効になるようにしてみます。
目標は「Entryに入力した文字列がhttps://
で始まれば文字は黒、ボタンは有効化される。そうでない場合は文字は赤、ボタンは有効化されない」です。
これを実現するため、Xamarin.FormsのMessagingCenter
という機能を使いました。
MessagingCenter
とは、簡単に言いますとメッセージの送受信ができる機能です。Send
でメッセージを送信し、Subscribe
でメッセージを受信して処理を行います。
では実際にどのようにコードを書いたのか見てみましょう。(前回の記事からの変更部分のみコメントをしています)
UrlValidationBehavior.cs
using System; using Xamarin.Forms; namespace XF_EntryCheck { public class UrlValidationBehavior : Behavior<Entry> { //設定した条件を満たすかどうか判定 public bool IsValid { get; set; } protected override void OnAttachedTo(Entry bindable) { bindable.TextChanged += OnEntryTextChanged; base.OnAttachedTo(bindable); } protected override void OnDetachingFrom(Entry bindable) { bindable.TextChanged -= OnEntryTextChanged; base.OnDetachingFrom(bindable); } void OnEntryTextChanged(object sender, TextChangedEventArgs args) { var m = args.NewTextValue.StartsWith("https://", StringComparison.Ordinal); ((Entry)sender).TextColor = m ? Color.Default : Color.Red; //判定結果を代入 IsValid = m; //メッセージの送信 MessagingCenter.Send(this, "IsValid"); } } }
MainPage.xaml
<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:XF_EntryCheck" x:Class="XF_EntryCheck.MainPage"> <StackLayout VerticalOptions="Center"> <Entry x:Name="entry" Placeholder="Entry"> <Entry.Behaviors> <local:UrlValidationBehavior x:Name="urlValidationBehavior"/> </Entry.Behaviors> </Entry> <!-- ボタンを追加 --> <Button x:Name="button" Text="Button" HorizontalOptions="Center" /> </StackLayout> </ContentPage>
MainPage.xaml.cs
using Xamarin.Forms; namespace XF_EntryCheck { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); //メッセージの受信 MessagingCenter.Subscribe<UrlValidationBehavior>(this, "IsValid", (sender) => { EntryChanged(); }); } //ボタンの有効・無効を判定 void EntryChanged() { button.IsEnabled = urlValidationBehavior.IsValid; } } }
UrlValidationBehavior.cs
のOnEntryTextChanged
イベントが実行された時にメッセージを送信し、MainPage
クラスがメッセージを受信後、EntryChanged()
を実行するという動きになっています。
それでは早速動かしてみましょう。
目標は「Entryに入力した文字列がhttps://
で始まれば文字は黒、ボタンは有効化される。そうでない場合は文字は赤、ボタンは有効化されない」です。
実現したかった動作は出来ていますね!
参考にしたページ
Xamarin.Forms の MessagingCenter - Xamarin | Microsoft Docs
Xamarin.Formsでビヘイビアーを使用するには? - Build Insider