2017年1月18日水曜日

Xamarin.Forms + MVVMLightでダイアログを表示する

Xamarin.Forms + MVVMLightでダイアログを表示する。

MVVMで、ViewModelからViewを制御して、ダイアログを表示する。

簡単なサンプルを表示する。


XAMLを使っているので、Pageのコードビハインドに、Notificationの受け口を設定
DisplayAlert を使って、ダイアログを表示している。

using GalaSoft.MvvmLight.Messaging;

namespace AskaShop.View {
    public partial class LoginPage : ContentPage {
        public LoginPage() {
            InitializeComponent();
            BindingContext = App.Locator.Login;

            // Messenger 経由で ViewModel から UI 操作を要求されたとき行う処理を登録しておく。
            Messenger.Default.Register<NotificationMessage>(this, this.Alert);
        }

        public void Alert(NotificationMessage message) {
            DisplayAlert("", message.Notification, "OK");
        }
    }
}


ViewModel側のコード

using GalaSoft.MvvmLight.Messaging;
namespace AskaShop.ViewModel {
    public class LoginViewModel : ViewModelBase {
        #region local variable
        private readonly IWcfServiceWrapper _wcfServiceWrapper;

        private bool _isCallingWebservice;

        private string _entUserId;
        private string _entPassword;
        private string _lblBuild;
        private string _btnLoginColor;
        #endregion

        public LoginViewModel(IWcfServiceWrapper wcfServiceWrapper) {

            if (wcfServiceWrapper == null) throw new ArgumentNullException("wcfServiceWrapper");
            _wcfServiceWrapper = wcfServiceWrapper;

            SubmitCommand = new RelayCommand(GetResponseAsync, () => CanGetResponse);
            CanGetResponse = true;
            IsCallingWebservice = false;
            btnLoginColor = "Blue";
            lblBuild = "Build 17-01-14/18";
        }

        private async void GetResponseAsync() {

            CanGetResponse = false;      //ボタンを無効
            IsCallingWebservice = true;  //処理中の表示
            btnLoginColor = "#1e90ff";   //ボタンの背景色をdodgerblueへ変更

            if (_entUserId == null || _entUserId.Trim() == "") {
                CanGetResponse = true;
                IsCallingWebservice = false;
                btnLoginColor = "Blue";

                // Messenger 経由で View に DisplayAlert の表示を要求する。
                MessengerInstance.Send(new NotificationMessage("ユーザーIDが未入力です。"));
                return;
            }

            if (_entPassword == null || _entPassword.Trim() == "") {
                CanGetResponse = true;
                IsCallingWebservice = false;
                btnLoginColor = "Blue";

                // Messenger 経由で View に DisplayAlert の表示を要求する。
                MessengerInstance.Send(new NotificationMessage("パスワードが未入力です。"));
                return;
            }

            var vUser = await _wcfServiceWrapper.GetUser_MstAsync(_entUserId, _entPassword);

            if (vUser.USERID == null) {
                CanGetResponse = true;
                IsCallingWebservice = false;
                btnLoginColor = "Blue";

                // Messenger 経由で View に DisplayAlert の表示を要求する。
                MessengerInstance.Send(new NotificationMessage("ユーザーIDもしくは、パスワードが間違っています。"));
                return;
            }

            //global変数の編集
            App.UserId         = vUser.USERID;
            App.UserName       = vUser.USER名;
            App.得意先Cd       = vUser.得意先CD;
            App.得意先名       = vUser.得意先名;
            App.メールアドレス = vUser.メールアドレス;
            App.得意先単価GRP  = vUser.得意先単価GRP;
            App.カレンダー区分 = vUser.カレンダー区分;
            App.事業所Cd       = vUser.事業所Cd;
            App.営業所Cd       = vUser.営業所Cd;

            //画面遷移
            App.Current.MainPage = new EbiShop.View.MenuPage();
        }
    }
}

ViewModel側は、 MessengerInstance.Send(new NotificationMessage("パスワードが未入力です。"));

だけでOKだった。

0 件のコメント:

コメントを投稿