shuhelohelo’s blog

Xamarin.Forms多めです.

Commandを使って非同期メソッドを実行する

WPFやXamarin.FormsなどXAMLを使用するアプリケーションの場合,ビューとロジックを分離するためにCommandを使ったりします.

一般的な書き方は以下のとおりです.

(注意:RefreshCommand = new Command(ExecuteRefreshCommand);this.BindingContext = this;よりも前書く必要があります)

        //XAML側でバインドするCommandプロパティを用意
        public ICommand RefreshCommand { get; }

        public MainPage()
        {
            InitializeComponent();

            //このCommandが呼び出されたときに実行するメソッドを指定
            RefreshCommand = new Command(ExecuteRefreshCommand);


            this.BindingContext = this;
        }

        //実行されるメソッド
        private void ExecuteRefreshCommand(object obj)
        {
            //何かの処理
        }

次は,この実行されるメソッドが非同期メソッドの場合です.

以下のような非同期メソッドを実行したいとします.

        private async Task ExecuteRefreshCommand(object obj)
        {
            await Task.Delay(2000);
        }

このとき,RefreshCommandへの登録は以下のようになります.

            RefreshCommand = new Command(async (o)=>await ExecuteRefreshCommand(o));

これで非同期メソッドが呼び出され,CommandParameterも渡されます.

もう一つの書き方.

上の例ではExecuteRefreshCommandメソッドを作成して,それを呼び出していますが,これをLambda式だけで書く場合は以下のようになる.

            //RefreshCommand = new Command(async (o) => await ExecuteRefreshCommand(o));
            RefreshCommand = new Command(async (o) => {
                await Task.Delay(2000);

                People.Clear();

                People = GeneratePeople(DateTime.Now.ToString());

                //ぐるぐるを非表示にする
                IsRefreshing = false;
            });