Caliburn Micro:在 ViewModel 之间传递对象

2024-02-02

我正在使用 Caliburn Micro 2.0.0-alpha2 开发一个简单的 Crud 应用程序(一个 Windows 8.1 商店应用程序)

我在视图模型之间导航、传递对象时遇到麻烦。

我多次阅读了提出的解决方案

安德斯·古斯塔夫森(如何使用 WinRT Caliburn.Micro 将参数传递给导航视图模型? https://stackoverflow.com/questions/15251867/how-to-pass-parameter-to-navigated-view-model-with-winrt-caliburn-micro)

我尝试让它适应我的范围。 但该对象始终为空。

I need to pass a single object selected from a listView to my crudPage. The crudPage is composed by an userControl that shown the FormView. So i want to initialize this Form, with the values of the passed object. solution proposed

我认为问题在于“参数”仅在创建 ViewModel 之后才初始化,但我不知道如何解决该问题。

这是我的代码,根据 Anders Gustafsson 的想法

TransporterListViewModel(数据库中的运输商列表)

public class TransporterListViewModel : ViewModelBase
{
    public string Title { get; set; }
    public TransporterListViewModel(INavigationService navigationService)
        : base(navigationService)
    {
        LoadData();
    }

    public async void LoadData() {

        _transporters = await TransporterService.GetAll();
    }

    private BindableCollection<Transporter> _transporters;

    public BindableCollection<Transporter> Transporters
    {
        get
        {
            return this._transporters;
        }
        set
        {
            this._transporters = value;
            NotifyOfPropertyChange(() => this.Transporters);
        }
    }

    private Transporter _selectedItem;
    public Transporter SelectedItem
    {
        get 
        {

            return _selectedItem;
        }

        set
        {
            _selectedItem = value;
            NotifyOfPropertyChange(() => this.SelectedItem);

            navigationService.Navigated += NavigationServiceOnNavigated;
            navigationService.NavigateToViewModel<TransporterCrudPageViewModel>(_selectedItem;);
            navigationService.Navigated -= NavigationServiceOnNavigated;
        }
    }

    private static void NavigationServiceOnNavigated(object sender, NavigationEventArgs args)
    {
        FrameworkElement view;
        TransporterCrudPageViewModel transporterCrudPageViewModel;
        if ((view = args.Content as FrameworkElement) == null ||
            (transporterCrudPageViewModel = view.DataContext as TransporterCrudPageViewModel) == null) return;

        transporterCrudPageViewModel.InitializeTransporterForm(args.Parameter as Transporter);
    } 

Transporter Crud ViewModel(包含要初始化的用户控件的页面)

public class TransporterCrudPageViewModel : ViewModelBase
{
    public string Title { get; set; }

    public Transporter Parameter { get; set; }
    public TransporterFormViewModel TransporterFormVM { get; set; }

    public async void InitializeTransporterForm(Transporter enumerable)
    {
        TransporterFormVM = new TransporterFormViewModel(navigationService, enumerable);
        await SetUpForm(enumerable);
    }

    public async Task SetUpForm(Transporter t){
        TransporterFormVM.trName = t.trName;
        TransporterFormVM.trUrl = t.trUrl;

    }
    public TransporterCrudPageViewModel(INavigationService navigationService)
        : base(navigationService)
    {
        Title = "TransporterCrud Page";
        //this.navigationService = navigationService;

        this.InitializeTransporterForm(Parameter);

    }

TransporterFormViewModel(要初始化的 userContol)

    public class TransporterFormViewModel :ViewModelBase
{


    public string Title { get; set; }

    public Transporter Transporter { get; set; }

    public TransporterFormViewModel(INavigationService navigationService,Transporter trans)
        : base(navigationService)
    {
        Transporter = trans;
    }



    private string _trName;
    public string trName 
    {
        get
        {
            return _trName;
        }
        set
        {
            _trName = value;
            NotifyOfPropertyChange(() => trName);
        }
    }


    public string trCode { get; set; }
    public string trUrl { get; set; }

    public int trId { get; set; }

在构造函数中TransporterCrudViewModel你有的课程:

this.InitializeTransporterForm(Parameter);

where Parameter是类型的属性Transporter未初始化,您将调用该方法InitializeTransporterForm with a null范围。然后你会打电话SetUpForm参数为空值的方法Transporter t。我认为你应该以某种方式初始化这个属性。

然后,假设您继续您的TransporterListViewModel与此类:

transporterCrudPageViewModel.InitializeTransporterForm(args.Parameter as Transporter);

在方法中InitializeTransporterForm,您没有将传递的参数设置为属性的值Parameter像这样的东西:

public async void InitializeTransporterForm(Transporter enumerable)
{
     TransporterFormVM = new TransporterFormViewModel(navigationService, enumerable);
     this.Parameter = enumerable; //setting the Parameter property..
     await SetUpForm(enumerable);
}

除了这些注释之外,您还应该在您的 IDE 中放置一个断点

transporterCrudPageViewModel.InitializeTransporterForm(args.Parameter as Transporter);

确保该房产Parameter of the NavigationEventArgs对象不为空。

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

Caliburn Micro:在 ViewModel 之间传递对象 的相关文章

  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • MarkLogic 9 cts.parse 无法正确解析查询

    我正在使用 MarkLogic 9 开发基于 Web 的搜索应用程序 我有一个查询构建界面 允许用户将字符串输入到与数据库中文档的特定 JSON 属性相对应的文本框中 这个想法是 用户可以完全按照 cts parse 我使用服务器端 jav
  • 最外面的 CascadingValue 在页面刷新或直接链接时丢失

    我想在我的 Blazor 应用程序中共享几个组件 这些恰好是 SyncFusion 组件 一个是 SfToast 一个是 SfDialog 我认为一个简单的方法是将组件放在 MainLayout razor 上 然后使用
  • 如何“检查”函数是否确实给出随机结果?

    如何确定一个函数确实是随机的或者尽可能接近这个概念 另外 随机和伪随机之间有什么区别 最后 可以使用哪些算法 来源来生成随机数 P S 也问这个是因为 MySQL 语句使用ORDER BY RAND LIMIT 1没有给出令人信服的结果 随
  • 抽象类的可访问性不一致

    我有一个内部抽象类InternalClassBase和两个 也是内部 类InternalClass1 and InternalClass2 继承自InternalClassBase 我还有一个公共抽象类PublicClassBase和两个
  • 使用 Java 解析包含转义字符的字符串

    我想知道是否有人可以帮助我弄清楚如何解析具有以下格式的字符串 field1 field2 fieldN field1 field2 fieldN 每条记录均以 分隔记录中的每个字段均以 分隔 复杂的是各个字段可能包含转义分隔符 例如 或者
  • D3.js 如何旋转路径上的文本

    这是我的第一个 D3 项目 我不是程序员 所以一次性学习所有内容 我正在尝试制作一个圆形日历 我已经手绘了好几年了 这是一个巨大的痛苦 大多数位现在都可以工作 但我不知道如何将文本旋转 90 度在这条弧线上 一旦我转动了文本 我就需要弄清楚
  • 创建算法=未定义的定义器

    我从远程服务器备份了一些数据库 当我尝试导入该备份时 我的本地服务器遇到了问题 我在这一行收到错误 CREATE ALGORITHM UNDEFINED DEFINER root SQL SECURITY DEFINER VIEW tema
  • 如何重塑数据集(从长到宽),每个类别有两个测量列,而无需在 R 中进行额外计算

    我有长格式的数据集 请参阅下面的代码来生成此数据集 region week average percent A 20 5 30 A 21 7 40 A 22 15 50 B 20 4 15 B 21 8 27 B 22 3 11 我想准备它
  • 如何通过两个属性和排序器对对象列表进行排序

    我必须按姓氏和名字对对象列表进行排序 如果多个对象有相同的姓氏 我还必须对这些应用 Collat or 假设我可以对一个属性执行此操作 val collator Collator getInstance context getResourc
  • 如果在添加注释时缩放,MKMapView 会崩溃

    看来我遇到了一个问题 我可以可靠地导致我的MKMapView如果我在更改地图的可见区域时添加注释 则会崩溃 我已经将导致它的代码简化为一个非常简单的实现 并且我在这里重现它 NSMutableArray pointAnnotationArr
  • 在 if() 块中分配多个变量时出现意外行为

    本着看的精神像Python的 and 一样的短路评估 同时存储检查结果 https stackoverflow com q 39603391 2191572我决定看看如何在 PHP 中最好地解决这个问题 但我遇到了一个问题 意外
  • 当人们翻转图像视图时如何左右移动,使其看起来像真的向左和向右移动

    风格应该像iBooks或foursquare中的图片 当我们向左翻转时 我们会看到下一张图片被拉出 怎么办呢 有代码可以做到这一点吗 我认为一定有一个现成的代码 听起来像你想要的UIPageViewController https deve
  • 通过 ECDSA 证书问题提升 asio

    我正在使用 boost asio 实现 SSL 服务器 上下文初始化如下面的代码所示 boost asio ssl context base method SSL version static cast
  • 如何使用drawRect在现有视图中绘制?

    我正在做一个 GPS 跟踪应用程序 每次它收到纬度 经度时 都会将其转换为 x y 坐标并调用drawRect在两对 x y 之间画一条线 然而 drawRect方法只是在绘制新内容之前清除所有旧内容 我怎样才能让drawRect在现有的画
  • C#中如何通过接口实现事件?

    我有一个问题 假设我有一个基于插件的系统 我需要某种接口 用它可以捕获来自每个插件的事件 例如IReporting界面 IReporting object OnSomeEvent lt gt 但我找不到办法做到这一点 你应该写 IRepor
  • 我需要从 HTML 转到 Markdown,有什么建议吗?

    我正在使用 Maruku 从 Markdown 超集 转换为 HTML 你知道如何从 HTML 转换为 Markdown 吗 Google 发现了一个名为的 ruby 脚本反向降价 https github com xijo reverse
  • Pandas:时间序列数据:如何选择一小时、一天或一分钟的行?

    我的 csv 文件中有巨大的时间序列数据集 文件中有两列 values 这些是示例值 dttm utc 这些是收集样本时的时间戳 我已使用将数据导入 pandaspd read csv parse dates dttm utc 当我打印前
  • 如何在windows Qt中使用linux字体?

    我们在 MS Windows 上为 Linux 开发嵌入式 Qt 应用程序 目标平台是没有X windows framebuffer 的linux 不幸的是 Windows 上的屏幕看起来与 Linux 上的相同屏幕有很大不同 更好 因为
  • ADFS 与现有 ASP.Net MVC 应用程序

    我一直在四处寻找 试图找到如何将 ADFS 身份验证添加到现有 ASP Net MVC 应用程序的示例 我发现了很多关于在创建新应用程序时如何使用向导来完成此操作的示例 我可以创建一个新的应用程序并复制代码和配置 但这似乎是一种奇怪的方法
  • Caliburn Micro:在 ViewModel 之间传递对象

    我正在使用 Caliburn Micro 2 0 0 alpha2 开发一个简单的 Crud 应用程序 一个 Windows 8 1 商店应用程序 我在视图模型之间导航 传递对象时遇到麻烦 我多次阅读了提出的解决方案 安德斯 古斯塔夫森 如