【问题标题】:Accessing a property in one ViewModel from another从另一个 ViewModel 访问一个属性
【发布时间】:2013-05-06 13:52:18
【问题描述】:

我希望主视图模型有一个特定列表,然后从许多其他视图模型访问。

例如,在 MainViewModel.cs 我将有一个 50 个数字的列表, 然后在 NumListViewModel.cs 中,我想访问它以将其显示为列表,在 AddNumViewModel.cs 中我希望能够更新该列表。

有人建议我使用 events / evenaggerator,我这样做了,但不幸的是,据我所知,我所能做的就是将一个 num 从一个视图发送到另一个视图并告诉它更新列表,但问题是是,随着程序的增长,我需要在主视图模型中有很多订阅者,当实际发生某些事情时,我将不得不根据订阅者的数量“发布”事件,这使得维护变得更加困难。

我还找到了另一个答案,指示在 mainVM 中创建另一个 VM 的实例,参数设置为“this”,这是对 mainVM 的引用。 它有效,但话又说回来,它可能会变得很长。

所以我的问题是,有没有一种更好的方法可以从另一个 VM 访问属性?
就像字面上有一个在 mainVM 中保存列表的类的实例,然后只需能够从其他 VM 更新/访问它,而无需显式编程哪个 VM 可以。会让生活变得更轻松。

在您的回答中,请尽量避免建议框架。 虽然有一些非常好的,但我希望自己至少能够做到这一点。

例如:

MainVM.cs:

public class MainVM
{
    List lst = new List(); //Let's just say it's full...
}

其他VM.cs:

public class OtherVM
{
    lst.Add(3);
}

PS:是的,我知道它已经被问过了,是的,我已经完成了我的研究,但是我发现的答案太“静态”了,我猜?

【问题讨论】:

  • 使用 Prism 解析 MainViewModel 的实例。

标签: c# wpf mvvm viewmodel


【解决方案1】:

如果您希望直接从外部 ViewModel 访问列表,那么您的选择是:

  1. 将列表作为构造函数参数或公共属性传递给 OtherVM。然后,OtherVM 可以将其视为成员。

  2. 将 MainVM 作为构造函数参数或公共属性传递给 OtherVM。然后OtherVM可以通过先访问MainVM来访问List。

  3. 为 MainVM 提供一个名为“Default”或“Ins​​tance”的静态属性,这样您就可以从 OtherVM 中访问 MainVM 的静态实例,而无需将其分配为成员字段。

例子:

public class MainVM
{
    private static MainVM _instance = new MainVM();
    public static MainVM Instance { get { return _instance; } }

    public List<XX> MyList { get; set; }
    //other stuff here
}

//From within OtherVM:
MainVM.Instance.MyList.Add(stuff);

【讨论】:

  • 非常感谢!选项#3 完成了任务!选项 1 和 2 可以正常工作,但是随着项目的增长,我将不得不多次传递实例/列表,所以我想这对于大型应用程序来说不是一个好习惯。
  • @BTownTKD 我知道这个问题有点老了,但我有一个问题。我已经尝试过您的代码,但顺序相反。即我已经在 OtherVM 上声明了 Instance 属性,我想在 mainVM 中访问它。我没有收到任何错误,但是当我在 MainVM 中访问 OtherVM 的任何属性时,我没有得到该属性的值。我的意思是我得到 null 而不是那个属性的值。
  • 你会想把它作为一个新问题发布。
  • @BTownTKD 您能否在#2 中发布该方法的示例?我究竟如何将列表/对象作为 ctor 参数传递?
  • @BTownTKD 在以下场景中我遇到了第三个选项的问题:在MainVM 的构造函数中,我正在调用OtherVM 构造函数。在 OtherVm 构造函数中,我使用了 Instance 属性。在这种情况下 Instance 为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多