从集合中访问MVVM父视图模型

时间:2011-01-11 17:48:09

标签: c# .net wpf mvvm

alt text

上图说明了我的计划。箭头表示Binding

我的MainWindow.xaml将其datacontext设置为MainVM

窗口的标签控件绑定到ObservableCollection ViewModel秒。使用数据模板,选项卡控件显示与ViewModel对应的视图。

ObservableCollection中找到了MainVM

如何从MainVM(包含在ObservableCollection中)访问ViewModel中找到的属性?

我愿意接受需要修改编程模型的答案。

3 个答案:

答案 0 :(得分:6)

以肯特所说的为基础。 。

从架构的角度来看,您的ViewModel类不需要了解有关MainVM的任何信息。它需要知道的任何东西都应该传递给ViewModel的实例,这样它就可以保持原子性,而不必担心调用它的东西。从SOLID的角度来看,这是依赖性倒置原则。

在ViewModel中需要访问MainVM的任何属性都应该作为构建ViewModel实例的一部分传递。就个人而言,我很喜欢将它们包含在构造函数中,但您也可以将它们作为属性公开。

一个overkill方法(我不推荐),正在设置你的构造函数来获取MainVM的一个实例,并在构造函数中传入this。 e.g:

public class ViewModel
{
    private readonly MainVM _parent;

    public MainVM Parent => _parent;

    public ViewModel(MainVM parent)
    {
          _parent = parent;
    }
 }

然后当您创建ViewModel时,您可以:

 ViewModel vm = new ViewModel(this);

答案 1 :(得分:4)

根据您需要的交互量,您可以通过从ViewModel类触发事件并让MainVM处理它们并相应地在单个ViewModel上设置属性来采取相反的方式。

另一个选择是当你实例化ViewModel Collection时(我假设它是在MainVM某处完成的?),你可以将MainVM作为构造函数参数传入并保留MainVM的{​​{1}}实例每个ViewModel

答案 2 :(得分:2)

谁创建了ViewModel的实例?如果MainVMViewModel之间存在紧密的关系,那么ViewModel可能会在其构造函数中使用MainVM的实例。

另一种方法是提出一种不需要ViewModel访问MainVM的不同设计。这样做需要更多信息(以及单独的问题)。