上图说明了我的计划。箭头表示Binding
。
我的MainWindow.xaml将其datacontext设置为MainVM
。
窗口的标签控件绑定到ObservableCollection
ViewModel
秒。使用数据模板,选项卡控件显示与ViewModel
对应的视图。
ObservableCollection
中找到了MainVM
。
如何从MainVM
(包含在ObservableCollection中)访问ViewModel
中找到的属性?
我愿意接受需要修改编程模型的答案。
答案 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
的实例?如果MainVM
和ViewModel
之间存在紧密的关系,那么ViewModel
可能会在其构造函数中使用MainVM
的实例。
另一种方法是提出一种不需要ViewModel
访问MainVM
的不同设计。这样做需要更多信息(以及单独的问题)。