WPF - 访问父DataContext

时间:2014-10-08 04:10:32

标签: wpf data-binding datacontext

我的WPF项目设置如下

在我的MainWindow中,我有一些标签。 SearchJob选项卡和编辑作业选项卡,选项卡显示各自的用户控件

他们都有自己的ViewModels作为他们的DataContext

MainWindow - MainWindowVM
SearchJobs - SearchJobsVM
EditJob - EditJobVM

在我搜索作业后,我得到一个绑定到Job对象的ObservableCollection的网格

当我双击结果网格时,我想让编辑选项卡可见,通过它的视图模型我双击的行的ID

我还想让我的MainWindow中的一些标签隐藏起来。选项卡绑定到MainWindowVM中的Visibility属性

我能够获得双击

的行的ID

我的问题是,SearchJobsVm我需要访问机器人MainWindowVM来设置可见性属性,还可以访问EditJobVM来设置ID

如何从MainWindowVM访问EditJobVMSearcvhJobVM的DataContext(视图模型)?

在Mainwindow中我像这样设置DataContext: -

<Window.DataContext>
    <vm:MainWindowViewModel />
</Window.DataContext>

并在xaml中添加用户控件,如此

<TabItem Header="Search">
       <Grid Background="#FFE5E5E5">
             <uc:SearchJobView></uc:SearchJobView>
       </Grid>
</TabItem>

我的SearchJobView的DataContext设置如下: -

<UserControl.DataContext>
    <vm:SearchJobViewModel/>
</UserControl.DataContext>

我的EditJobView的DataContext设置如下: -

<UserControl.DataContext>
    <vm:JobViewModel/>
</UserControl.DataContext>

1 个答案:

答案 0 :(得分:1)

简单的方法是MainVM包含SearchJobsVM和EditJobVM的两个实例。现在,MainVM可以简单地处理所有内容。

例如,SearchJobVM会为您的doubleclick内容公开一个事件。 MainVM订阅此事件并将eventargs中的Id提供给EditJobVM,并将当前工作空间设置为EditJobVM。

EDIT。我会在您的子视图中使用DataTemplates,在MainView中使用contentPresenter。但您也可以使用TabControl并设置可见性

<DataTemplate DataType="{x:Type local:EditJobVM}">
 <uc:EditJobUsercontrol/>
</DataTemplate>

的MainView

 <ContentPresenter Content="{Biinding 'Workspace}"/>

MainVM

  public object WorkSpace {get;set;}


  this.Workspace = this._myInstanceOfEditJobVM; //now the EditJobView is shown in the contentpresenter