繁体   English   中英

从另一个 ViewModel 访问一个属性

[英]Accessing a property in one ViewModel from another

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

例如,在 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:是的,我知道它已经被问过了,是的,我已经进行了研究,但是我发现的答案太“静态”了,我猜?

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

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

  2. 将 MainVM 作为构造函数参数或公共属性传递给 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 提供一个名为“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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM