如何直接绑定到子视图模型?

时间:2014-02-06 16:32:12

标签: c# wpf xaml mvvm

目标是直接访问子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}"

有什么想法吗?

3 个答案:

答案 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}}"