c# - 从一个 ViewModel 访问另一个 ViewModel 中的属性

标签 c# wpf mvvm viewmodel

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

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

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

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

所以我的问题是,是否有更好的方式从另一个 VM 访问属性?
就像在 mainVM 中拥有一个包含列表的类的实例,然后就可以从其他 VM 更新/访问它,而不必明确编程哪个 VM 可以。会让生活变得更轻松。

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

例如:

主虚拟机.cs:

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

其他VM.cs:

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

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

最佳答案

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

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

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

例子:

public class MainVM
{
    public List<XX> MyList { get; set; }
}

public class OtherVM
{
    public MainVM TheMainVM { get; set; }

    public OtherVM(MainVM theMainVM)
    {
        TheMainVM = theMainVM;
        
        // Access the MainVM's list 
        TheMainVM.MyList.Add(stuff);            
    }
}
  1. 为 MainVM 提供一个称为“默认”或“实例”的静态属性,这样您就可以从 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);

关于c# - 从一个 ViewModel 访问另一个 ViewModel 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16506653/

相关文章:

c# - 从 aspx 页面访问代码隐藏中的对象

c# - Visual Studio Express 2012 如何在构建成功时隐藏编译细节并在构建失败时显示它

c# - ftpe ://URI prefix is not recognized by FtpWebRequest

c# - TextBox LostFocus 事件发生得太频繁

wpf - 在 Checkbox.Checked 或 Unchecked 上执行命令

c# - 使用 Nest (Elasticsearch) 执行 DeleteByQuery 时获取 "An item with this key has already been added"

c# - 调用线程无法访问此对象,因为另一个线程拥有它。WPF

c# - 如何在我的 ViewModel 中监听来自另一个 ViewModel 的更改?

WPF X :Name causes type name 'ViewModel' Compile Error

c# - WPF TabControl上下文菜单在mvvm中右键单击项目