在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");
答案 0 :(得分:11)
使用ACR User Dialogs是最简单的方法。
在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使用接口的特定于平台的实现。
答案 1 :(得分:5)
这就是我在viewmodel中处理Alert消息的方法。试试这个。
await App.Current.MainPage.DisplayAlert("Active subscription required", "You do not have an active subscription for Part 2 exams", "OK");
答案 2 :(得分:3)
现有一个名为User Interaction的MvvmCross插件允许显示警报并从ViewModels收集输入。
来自作者BrianChance:
显示消息框或从ViewModel收集用户输入的简单,简单,美观的方式
Check it out here和NuGet Link Here。
要安装插件,请确保在iOS和Android(和Windows手机)上的SetUp类中覆盖LoadPlugins,如下所示:
public override void LoadPlugins(MvvmCross.Platform.Plugins.IMvxPluginManager pluginManager)
{
base.LoadPlugins(pluginManager);
pluginManager.EnsurePluginLoaded<Chance.MvvmCross.Plugins.UserInteraction>();
}
答案 3 :(得分:1)
我的方法是我在这个场景中使用一个事件。我的视图模型的基类有一个EventHandler OnUserNotification,视图可以订阅。 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建议的插件,所以这可能是一个更顺畅的实现?
答案 4 :(得分:1)