android - MvvmCross Navigate to ViewModel on Android 通知点击

标签 android xamarin mvvmcross

我正在使用 Support.V7.NotificationCompat 显示通知。单击此通知时,我想导航到 ViewModel。当我尝试使用 MvxViewModelRequest 显示 ViewModel 时,我传递给 ViewModel 的导航参数不起作用,但当我像这样使用 ShowViewModel 时它有效:

ShowViewModel<RouteModificationViewModel>(new { id = existingModification.Id });

这是 ViewModel Init 方法。当我使用 ShowViewModel 导航时,Guid 具有正确的值。当我使用 MvxViewModelRequest 导航时,Guid 始终具有值 Guid.Empty(全为 0)。

public void Init(Guid id)
{
    _routeModificationId = id;
}

这就是我试图从通知中显示 ViewModel 的方式:

public void ShowRouteModifiedNotification(RouteModificationModel routeModificationModel)
{
    var context = Application.Context;
    var builder = new NotificationCompat.Builder(context);
    builder.SetDefaults(NotificationCompat.DefaultAll);
    builder.SetCategory(NotificationCompat.CategoryStatus);
    builder.SetAutoCancel(true);
    builder.SetPriority(NotificationCompat.PriorityHigh);
    builder.SetSmallIcon(Resource.Mipmap.ic_launcher);
    builder.SetContentTitle("Route Modification");
    builder.SetContentText("Hello, World!");
    builder.SetContentIntent(GetIntent(routeModificationModel.Id));
    builder.SetVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });
    builder.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification));
    var notification = builder.Build();
    var notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);
    var handler = new Handler(Looper.MainLooper);
    handler.Post(() =>
    {
       notificationManager.Notify(RouteModificationNotificationId, notification);
    });
}

private PendingIntent GetIntent(Guid guid)
{
    var request = MvxViewModelRequest<RouteModificationViewModel>.GetDefaultRequest();
    var json = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(new { id = guid });
    request.PresentationValues = new Dictionary<string, string>
    {
        { "id", json }
    };
    var translator = Mvx.Resolve<IMvxAndroidViewModelRequestTranslator>();
    var intent = translator.GetIntentFor(request);
    return PendingIntent.GetActivity(Application.Context, 0, intent, 0);
}

谁能看出我遗漏了什么或做错了什么?

最佳答案

MvvmCross 在 MvvmCross 5.0 及更高版本中对导航工作方式进行了重大更新。如果您使用的是 MvvmCross 4.x 或 3.x,则此问题可能仅相关。在这种情况下,4.x 中的 MvvmCross 导航 API 没有正确序列化 Guid。您可以通过将 Guid 序列化为字符串并将该字符串作为导航参数传递,然后将该字符串反序列化回 ViewModel 中的 Guid 来解决此问题。

关于android - MvvmCross Navigate to ViewModel on Android 通知点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35488194/

相关文章:

c# - 安装 Xamarin IOS.Setup 和 Android.Setup 时 "' 1.0.0 ' is not a valid short file name"

image - 使用 mvvmcross 和 mono 选择图像时出现问题

android - 改造 |解析嵌套的 JSON 对象(“预期为 BEGIN_ARRAY 但 BEGIN_OBJECT 位于...)

c# - 用信息填充表

xcode - faSTLane 无法安装在我的 imac 上

mvvmcross - 如何实现复合 ViewModel 的复合 View ?

xamarin.ios - 使用MvxImageViewLoader加载资源图片,可以吗?

android - 如何在android webview中打开 "google.navigation:q=<someLocation>"?

java - 如何让我的 ExpandableListView 等待加载,直到填充我的 HashMap?

android - 为每个应用程序安装生成唯一的加密 key 或盐