web-dev-qa-db-ja.com

ViewModelのアラートダイアログ-MVVMCross

ViewModelには、SaveプロパティをチェックするisValidメソッドがあります。

isValidfalseの場合、エラーメッセージを表示したいと思います。

AlertDialogはプラットフォーム固有なので、ViewModelでその状況をどのように処理しますか?

public void Save()
{
  if (isValid)
  {
      OnExit(this, null);
   }
   else
   {
      //issue an alert dialog here
   }
}

更新

次の plugin を使用し、次のコード行を次のように追加しましたが、エラーがスローされます。

else
{
    Mvx.Resolve<IUserInteraction>().Alert("it is not valid");
}

enter image description here

アップデート2

Chance.MvvmCross.Plugins.UserInteractionは名前空間ですが、型エラーとして使用されます。

enter image description here

アップデート3

Acr.UserDialogsプラグインを追加し、次のように呼び出しましたが、同じエラーが発生します。

Mvx.Resolve<IUserDialogs>().Alert("it is not valid");

enter image description here

11
casillas

ACRユーザーダイアログ を使用するのが最も簡単なアプローチです。

App.cs(Core/PCL)で、インターフェースを登録する必要があります。

_public class App : MvxApplication
{
    public override void Initialize()
    {
       // Example Other registrations
        CreatableTypes()
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();

        Mvx.RegisterSingleton<IUserDialogs>(() => UserDialogs.Instance);
    }
}
_

次に、ViewModelからアラートを呼び出すことができます。

_Mvx.Resolve<IUserDialogs>().Alert("it is not valid");
_

Androidプラットフォームサポートに関する注意

次に、Androidをサポートしている場合は、アクティビティコンテキストのインスタンスを使用してUserDialogを初期化する必要があります。これは、UserDialogsを使用する各アクティビティで実行する必要があります。そこで実行できる共有ベースアクティビティ。

_[Activity]
public class MainActivity : MvxActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.activity_main);

        // Initialize Acr UserDialogs
        UserDialogs.Init(this);
    }
}
_

あるいは

よりカスタムなモーダル実装が必要な場合は、インターフェイスのプラットフォーム固有の実装の使用について Mvvmcross document に従うことができます。

11
Plac3Hold3r

これは、ビューモデルでアラートメッセージを処理する方法です。これを試して。

await App.Current.MainPage.DisplayAlert("Active subscription required", "You do not have an active subscription for Part 2 exams", "OK");
5
Nurhak Kaya

ユーザーインタラクションと呼ばれる既存のMvvmCrossプラグインがあり、アラートの表示とViewModelsからの入力の収集が可能です。

著者BrianChanceから:

メッセージボックスを表示したり、ViewModelsからユーザー入力を収集したりするための本当にシンプルで簡単で美しい方法

ここで確認してください およびNuGetリンク ここ

プラグインをインストールするには、iOSのSetUpクラスでLoadPluginsをオーバーライドし、次のようにAndroid(およびWindows Phone)を使用するようにしてください。

public override void LoadPlugins(MvvmCross.Platform.Plugins.IMvxPluginManager pluginManager)
{
    base.LoadPlugins(pluginManager);
    pluginManager.EnsurePluginLoaded<Chance.MvvmCross.Plugins.UserInteraction>();

}
3
wishmaster

私のアプローチは、このシナリオでイベントを使用することです。ビューモデルの基本クラスにはEventHandlerOnUserNotificationがあり、ビューをサブスクライブできます。 UserNotificationTypeは単なる列挙型であり、状況にどのように反応するかをビューに決定させます。

プロパティ:

public EventHandler<UserNotificationType> OnUserNotification { get; set; }

呼び出し:

 if (OnUserNotification != null)
 {
   OnUserNotification.Invoke(this, UserNotificationType.ENetworkError);
 }

ビューで:

private void onUserNotification(object sender, UserNotificationType userNotificationType)
{
     // Do Something like showing a Snackbar, AlertDialog, etc...
}

もちろん、必要に応じてイベントタイプをより複雑にすることができます。

しかし、wishmasterによって提案されたプラグインを試していなかったので、よりスムーズな実装になる可能性がありますか?

1
Cyriac

Acr.UserDialogsを使用します。 github に素晴らしい例があります

あなたはそれをつかむことができます nuget

依存性注入または静的シングルトンUserDialogs.Instanceでうまく機能します

1
Allan Ritchie