【问题标题】:Alert Dialog in ViewModel - MVVMCrossViewModel 中的警报对话框 - MVVMCross
【发布时间】:2016-05-11 16:33:52
【问题描述】:

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");
}

更新 2

Chance.MvvmCross.Plugins.UserInteraction 是一个命名空间,但它被用作类型错误。

更新 3

我添加了 Acr.UserDialogs 插件并调用如下,但我得到了同样的错误。

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

【问题讨论】:

  • 您是否也将 nuget 添加到 Android 和 iOS 项目中?
  • 是的,我已经添加了 PCL、Android 和 iOS。我可以在 Android 解决方案中看到 Chance.MvvmCross.Plugins.UserInteraction.DroidChance.MvvmCross.Plugins.UserInteraction
  • 我刚刚注意到Mvvmcross插件没有保持最新,一些依赖无法解决。我建议您使用不同的插件:github.com/aritchie/userdialogs 您还可以在此处找到 xamarin 插件的完整列表:github.com/xamarin/XamarinComponents
  • 请看我的更新
  • 尝试显示警报时是否出现异常?日志中有什么?我确定您已经这样做了,但是您是否在 PCL 项目的 app.cs 中注册了 IUserDialog ? Mvx.RegisterSingleton(() => UserDialogs.Instance);

标签: c# xamarin mvvmcross


【解决方案1】:

使用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 使用接口的平台特定实现。

【讨论】:

  • 如果我需要在iOS中使用,UserDialogs.Init(this);需要去哪里?
  • @hotspring,不,iOS 不需要额外的操作 :)
  • iOS 和 Windows = "从 v4.x 开始不再需要任何东西" Github
  • 感谢您的回答。
  • Android 在主要活动中需要:UserDialogs.Init(() =&gt; Mvx.Resolve&lt;IMvxAndroidCurrentTopActivity&gt;().Activity)。见Setup section on GitHub
【解决方案2】:

这就是我在视图模型中处理警报消息的方式。试试这个。

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

【讨论】:

  • 能否详细说明Current.MainPage.DisplayAlert("xxxx");
  • 这是 Xamarin.Forms.Core.dll 中内置的 xamarin forms 方法,您应该可以通过键入我上面编写的代码从您的视图模型中轻松访问它。这个内置的 xamarin forms 方法通过一个取消按钮向应用程序用户显示一个警报对话框。更多细节和更多示例代码please see this link.
  • 当我输入App 时,App. 在我的情况下不显示任何选项。它只显示ReferenceEquals 属性。
  • 我刚刚创建了一个新的测试 Xamarin Portable 应用程序,我无需执行任何其他操作即可访问该方法。请看下文;
  • This is the documentation to create a xamarin portable app 这是我刚刚创建的测试应用程序代码。 public App() { // The root page of your application App.Current.MainPage.DisplayAlert("Test Title", "Test Message", "Cancel text"); }
【解决方案3】:

有一个名为 User Interaction 的现有 MvvmCross 插件,它允许显示警报并从 ViewModel 收集输入。

来自作者 BrianChance:

显示消息框或从您的 ViewModel 收集用户输入的真正简单、轻松、漂亮的方式

Check it out here 和 NuGet 链接Here

要安装插件,请确保在 iOS 和 Android(以及 windows phone)上的 SetUp 类中覆盖 LoadPlugins,如下所示:

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

}

【讨论】:

  • 我已添加该插件并运行该应用程序并收到错误消息。请查看我更新的问题。
【解决方案4】:

我的方法是在这种情况下使用一个事件。我的视图模型的基类有一个 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 推荐的插件没试过,这样实现会更流畅?

【讨论】:

  • 我应该在else 条件中添加什么?您能否提供更多信息?
  • 如果您的意思是 else 条件,您将使用 OnUserNotification.Invoke(this, UserNotificationType.EExampleError)。然后您可以在视图中处理通知事件。只要确保视图使用 ViewModel.OnUserNotification += onUserNotification 将方法附加到 Eventhandler;或者你调用的任何方法。
【解决方案5】:

使用 Acr.UserDialogs。 github上有一个很好的例子

您可以通过nuget获取它

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多