与父ViewModel绑定属性

时间:2013-09-10 11:04:48

标签: wpf viewmodel

请参阅How can I tell my DataTemplate to bind to a property in the PARENT ViewModel?

我有类似的问题......但是这个解决方案对我不起作用。我有一个MainViewModel,它有一个可观察的另一个视图模型集合,例如View1 / ViewModel1。这个视图有一个树控件,我需要树的上下文菜单。我的主视图有一个菜单。这些主菜单和上下文菜单已连接。那么如何将上下文菜单命令绑定到主视图模型的属性?

2 个答案:

答案 0 :(得分:13)

基本上,您需要使用RelativeSource绑定。标准方法是找到特定类型控件的祖先(或父级):

{Binding DataContext.PropertyName, RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type YourViewsNamespace:YourParentView}}}

假设您的父视图的视图模型设置为其DataContext,此绑定将访问它... DataContext是视图的DataContext,例如。设置为DataContext的视图模型。因此,PropertyName属性是该视图模型的公共属性。

关于您之前曾多次询问的部分问题,请参阅以下链接(或只是在线搜索):

Context Menus in WPF

Binding ContextMenu to its logical Parent

答案 1 :(得分:0)

1. ParentViewModel has NavigateRecordCommand

2. Parentview has the DataContext Set to my ParentViewModel.

<UserControl x:Class="SampleProject.UI.ParentView"

<Grid>
    ....
<!--User control is here-->
    <local:NavigationControl  Grid.Row="1" />
    ....
</Grid>


3. Child Control as below. Not bounded to its ViewModel. Bounded to Parent Views DataContext i.e. ParentViewModel.

    <UserControl x:Class="SampleProject.UI.NavigationControl"
    ...
    ...
     xmlns:Local="clr-namespace:SampleProject.UI">

    <Button Command="{Binding DataContext.NavigateRecordCommand, RelativeSource={RelativeSource AncestorType=Local:ParentView}}"
            CommandParameter="MoveFirst"/>