ViewModel
には、Save
プロパティをチェックするisValid
メソッドがあります。
isValid
がfalse
の場合、エラーメッセージを表示したいと思います。
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");
}
アップデート2
Chance.MvvmCross.Plugins.UserInteraction
は名前空間ですが、型エラーとして使用されます。
アップデート3
Acr.UserDialogsプラグインを追加し、次のように呼び出しましたが、同じエラーが発生します。
Mvx.Resolve<IUserDialogs>().Alert("it is not valid");
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 に従うことができます。
これは、ビューモデルでアラートメッセージを処理する方法です。これを試して。
await App.Current.MainPage.DisplayAlert("Active subscription required", "You do not have an active subscription for Part 2 exams", "OK");
ユーザーインタラクションと呼ばれる既存の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>();
}
私のアプローチは、このシナリオでイベントを使用することです。ビューモデルの基本クラスには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によって提案されたプラグインを試していなかったので、よりスムーズな実装になる可能性がありますか?