ViewModel中的警报对话框 - MVVMCross

时间:2016-05-11 16:33:53

标签: c# xamarin 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

5 个答案:

答案 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)

使用Acr.UserDialogs。 Demo on stackblitz

上有很多很好的例子

您可以在github

上抓取它

适用于依赖注入或静态单例UserDialogs.Instance