目标是直接访问子ViewModel中的属性,而不会丢失整个ViewModel结构的上下文。
目前,我在字典中有一个资源,其中包含对我用作整个应用程序的数据上下文的ViewModel的引用。
因此,我对每个视图的datacontext都是这样的:
DataContext="{StaticResource mainViewModel}"
在我的ViewModel中,我嵌套了子ViewModel,如下所示:
public class ParentViewModel {
public ChildVM ChildVM { get; set; }
public ParentVM(){
ChildVM = new ChildViewModel();
}
}
public class ChildViewModel {
public string SomeProperty { get; set; }
}
在我看来,我可以从数据上下文中访问属性,如下所示:
<Button Text="{Binding ChildVM.SomeProperty}"/>
但这非常重复。我希望能够做到:
<Button Text="{Binding SomeProperty}"/>
将我的datacontext设置为类似伪:
DataContext="{StaticResource MainViewModel, Path=ParentVM.ChildVM}"
有什么想法吗?
答案 0 :(得分:4)
您可以更改DataContext
控件组
<!-- DataContext is ParentViewModel -->
<Grid>
<!-- change DataContext to ChildViewModel -->
<Grid DataContext="{Binding Path=ChildVM}">
<Button Content="{Binding SomeProperty}"/>
<Button Content="{Binding AnotherChildProperty}"/>
</Grid>
</Grid>
答案 1 :(得分:2)
您可以在dkozl建议的那些控件的常用父级上设置DataContext。但是,如果该子视觉树相对较大,您应该考虑将UserControl专用于您的childVM:
<Grid>
<ChildControl DataContext={Binding ChildVM}/>
</Grid>
<UserControl x:Class="ChildControl">
<Grid>
<Button Content="{Binding SomeProperty}"/>
<Button Content="{Binding AnotherChildProperty}"/>
</Grid>
</UserControl>
答案 2 :(得分:1)
以这种方式为DataContext创建绑定,它将绑定到mainViewModel上的属性:
DataContext="{Binding ChildVM, Source={StaticResource mainViewModel}}"