将数据参数从模型传递到下一页 Prism Xamarin Forms

2024-01-13

我需要使用 Prism 将数据从 ViewModel 1 传递到 ViewModel 2。

TodoItem是我的模型与字符串:

public TodoItem _todotItem { get; set; }

private readonly INavigationService _navigationService;

我在构造函数中分配了它:

public MainPageViewModel(INavigationService navigationService, TodoItem todotItem)
{
    _navigationService = navigationService;
    _todotItem = todotItem;
}

这是我用来导航到下一页的代码(包括参数):

NavigationParameters navParams = new NavigationParameters();
navParams.Add("PassedValue", _todoItem.name);

_navigationService.NavigateAsync("SecondPage", navParams);

当我设置断点时_todoItem.name它说null。在我点击之前获取数据listview。我缺少什么?

Edit:

这就是我导航的方式(点击listview):

private EventItem _selectedEvent { get; set; }
public EventItem SelectedEvent
{
    get { return _selectedEvent; }  
    set
    {
        if (_selectedEvent != value)
        {
            if (Device.RuntimePlatform == Device.iOS)
            {
                _selectedEvent = null;
            }
            else
            {
                _selectedEvent = value;
            }
            NavigationParameters navParams = new NavigationParameters();

            navParams.Add("PassedValue", _todoItem.name);


            _navigationService.NavigateAsync("SecondPage", navParams);
        }
    }
}

我确实使用正确的方法来捕获第二个参数ViewModel(但是,我得到null在第一个ViewModel):

public void OnNavigatingTo(INavigationParameters parameters)
{
    if (parameters.ContainsKey("PassedValue"))
    {
        _todo = (string)parameters["PassedValue"];

        OnPropertyChanged("Todo");
    }

}

I use HTTPClient获取数据。


为了捕获第二页上的参数,您必须使用Prism.Navigation.INavigationAware。请检查下面的代码,也许会对您有所帮助。

./Views/ItemView.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
    prism:ViewModelLocator.AutowireViewModel="True" 
    x:Class="Project.Views.ItemView"
    Title="{Binding Title}">

    <StackLayout>
        <!-- List View -->
        <ListView ItemsSource="{Binding Items}" 
                  CachingStrategy="RecycleElement" 
                  HorizontalOptions="FillAndExpand"
                  VerticalOptions="FillAndExpand" 
                  HasUnevenRows="True" 
                  SelectionMode="None">
            <ListView.Behaviors>
                <b:EventToCommandBehavior EventName="ItemTapped" 
                                          Command="{Binding ItemTappedCommand}" 
                                          EventArgsParameterPath="Item" />
            </ListView.Behaviors>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <!-- Data Template Cell -->
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>

</ContentPage>

./ViewModels/ViewModelBase.cs

using Prism;
using Prism.Mvvm;
using Prism.Navigation;
using System;

namespace Project.ViewModels
{
    // INavigationAware provides a way for objects involved in navigation to be notified of navigation activities.
    public class ViewModelBase : BindableBase, INavigationAware, IDestructible
    {
        // ...

        protected INavigationService NavigationService { get; private set; }

        public ViewModelBase(INavigationService navigationService) => NavigationService = navigationService;

        /// <summary>
        /// Called when the implementer is being navigated away from.
        /// </summary>
        public virtual void OnNavigatedFrom(INavigationParameters parameters)
        {

        }

        /// <summary>
        /// Called when the implementer has been navigated to.
        /// </summary>
        public virtual void OnNavigatedTo(INavigationParameters parameters)
        {

        }

        // ...
    }
}

./ViewModels/ItemViewModel.cs

using Prism.Navigation;
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;

namespace Project.ViewModels
{
    public class ItemViewModel : ViewModelBase
    {
        // ...

        private ObservableCollection<ItemList> _items;
        public ObservableCollection<ItemList> Items
        {
            get => _items;
            set => SetProperty(ref _items, value);
        }

        public ICommand ItemTappedCommand => new AsyncCommand(ItemTappedCommandAsync);

        public ItemViewModel(INavigationService navigationService)
            : base(navigationService)
        {
            Items = new ObservableCollection<ItemList>();
            // Load the data
        }

        // ...

        private async Task ItemTappedCommandAsync(object item)
        {
            var navParams = new NavigationParameters
            {
                { "ItemSelected", (Item)item }
            };

            await NavigationService.NavigateAsync(nameof(ItemDetailView), navParams);
        }
    }
}

./ViewModels/ItemDetailViewModel.cs

using Prism.Navigation;
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;

namespace Project.ViewModels
{
    public class ItemDetailViewModel : ViewModelBase
    {
        // ...

        public override void OnNavigatingTo(INavigationParameters parameters)
        {
            // Capture the parameter
            System.Diagnostics.Debug.WriteLine(parameters);
        }

        // ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据参数从模型传递到下一页 Prism Xamarin Forms 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • Xamarin:“框架不在模块中”- VS 2013&2015

    我对 XAMARIN 支持感到非常失望 那么 我将从头开始 过去几个月一切都很好 直到我更新了 xamarin 的最新版本 4 0 3 214 结果是我现在无法调试 我收到以下消息 框架不在模块中 我向 Xamarin 支持发送了一封电子邮
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐

  • PHPUnit 分段错误 11

    我今天早上尝试运行 PHPUnit 它产生了 Segmentation Failure 11 错误 使用命令phpunit unit 如果我使用 Selenium 在功能测试中运行 PHPUnit 那么一切都会正常 只有单元测试受到影响 我
  • Android自定义EditText(货币格式)

    我有自定义的 EditText 它可以转换输入 也可以反转它 但是 它始终会使输入成为十进制 并在输入后面带有 1 或 2 个值 现在我正在制作一些计算应用程序 它需要整数 如何使这个自定义 EditText 仅接受整数输入和输出 代码 T
  • C++:IF 语句退出时出现段错误

    这次我将连同所有代码一起重新发布 我希望至少在一段时间内不关闭该帖子 我显然不是专家 以前从未遇到过类似的事情 但我确实认为这对其他成员很有用 我尝试了评论并同意错误与破坏有关 但找不到位置 我已在底部的评论中包含了段错误的位置 我没有 I
  • flutter:设置SnackbarAction标签的字体

    有没有办法在 flutter 中设置 SnackBarAction 的字体 好像用的是系统默认字体 SnackBarAction label my text how to sent font onPressed 您可以在 ThemeData
  • Angular JS 1.3.11:参数“MyController”不是函数

    我是角度新手 我有一个问题 我使用 1 3 11 版本的 Angular 我写了一个简单的 html 代码 使用简单的角度 但出现以下错误 参数 MyController 不是一个函数 在 AngularJS 中未定义 重复 html代码是
  • 使用jquery上传文件

    我想用ajax上传文件 这是我的代码 php html
  • 删除 ARC 后 Cocoa 中的观察员

    到目前为止 我一直在dealloc 中删除观察者 通知或KVO 既然 ARC 中不再有 dealloc 那么推荐的方法是什么 dealloc 不会在 ARC 下消失 ivar 释放和超级调用方面是自动处理的 如果这就是您要做的全部 则允许您
  • 如何使用 vue-gtag 让 Google Analytics GA4 识别我的 nuxt 网站?

    我有一个Nuxt js https nuxtjs org 我想用 Google Analytics 跟踪的网络客户端 我正在使用vue gtag https github com MatteoGabriele vue gtag像这样 plu
  • 在 Angular 中延迟加载图像的最简单方法是什么

    我有一个应用程序 允许通过键盘的右 左箭头键对大型文本数据集进行分页 显示的数据还包含图像 我想在用户快速分页数据时延迟这些图像的加载 1 2 秒 一旦用户停止在某个页面 所有图像都应该 延迟 加载 我尝试将此小提琴适应我的应用程序 但没有
  • C++ 在函数中仅使用一个默认参数

    我如何只使用第三个参数 第一个和第二个参数必须是默认值 像这样 double func const double a 5 const double b 6 const double c 7 int main cout lt lt A lt
  • EF 4.1 + MVC + JSON 循环引用异常的最佳解决方案?

    我使用 EF 4 1 Database First 方法 使用 T4 模板在单独的程序集中生成 POCO 类 我有用于获取数据的存储库 以及用于与 UI 通信的服务层 我试图制作级联下拉菜单 我是 MVC 和 EF 4 1 的新手 因此我在
  • 从外部函数访问列表

    我有一个在其中创建的列表function1 我希望能够访问和修改它function2 如果没有全局变量 我该如何做到这一点 这两个函数都不嵌套在另一个函数中 我需要能够将其推广到多个函数中的多个列表 我希望能够访问word list and
  • 如何减小 AspNet.ApplicationCookie 的大小以及其中的内容?

    在我们的生产环境中 仅限 任何管理员帐户都有很大机会收到 HTTP 错误 400 请求标头的大小太长 几乎可以满足任何要求 查看 cookie 我发现 AspNet ApplicaitonCookie 很大 有 15K 在我们的其他环境中
  • Maui Android 无法从捆绑包加载

    我有一个毛伊岛 Android 应用程序一直在运行 但突然在启动过程中崩溃了 查看输出窗口日志 似乎无法从捆绑包中提取 dll 我已经包含来自输 出窗口的日志 也许这会帮助某人识别问题 我不得不稍微修剪一下日志 因为它太长而无法发布 For
  • 在主机文件中指定IP与直接使用IP之间的区别

    在IE中访问内网URL时 以下有什么区别 在 drivers etc host 文件中添加名称和 IP 条目 与 直接使用IP 例如如果我有一个主机条目 XYZ 10 0 10 200 它可以使用以下链接 http XYZ SiteDire
  • 更改多任务视图中标题的颜色?

    我似乎找不到任何有关更改应用程序多任务视图中每个标题颜色的文档 正如您在下图中看到的 所有标题都是默认的白色 我知道它们是网页 但只是使用图像来显示我想要更改的内容 我刚刚创建了一个名为 标题颜色 对于科尔多瓦 仅适用于 Android 设
  • 过滤循环以创建多个数据框[重复]

    这个问题在这里已经有答案了 我有一个结构如下的数据框 df data frame topic c xxx xxx yyy yyy yyy zzz zzz high c 52L 27L 89L 99L 43L 21L 90L low c 56
  • 将充满文件的文件夹上传到 Amazon S3 中的特定文件夹

    还有一些其他类似的问题 但似乎没有一个具体回答我的问题 我有一个充满要上传到 Amazon S3 的文件的文件夹 我尝试了各种不同的方法 但都导致无法上传 这是我现在的代码 它成功在 S3 上创建文件夹 但未上传 import os imp
  • 排除单词/字符串的正则表达式

    我有一个正则表达式如下 a z0 9 这匹配诸如以下的字符串 hello or hello123 但是 我希望它排除几个字符串值 例如 ignoreme and ignoreme2 我尝试了几种变体 但似乎都无法工作 我最近的微弱尝试是 i
  • 将数据参数从模型传递到下一页 Prism Xamarin Forms

    我需要使用 Prism 将数据从 ViewModel 1 传递到 ViewModel 2 TodoItem是我的模型与字符串 public TodoItem todotItem get set private readonly INavig