首页 文章

WPF - 访问父DataContext

提问于
浏览
1

我的WPF项目设置如下

在我的MainWindow中,我有一些标签 . “搜索工作”选项卡和“编辑作业”选项卡,选项卡显示各自的用户控件

它们都有自己的ViewModels作为DataContext

MainWindow - MainWindowVM
SearchJobs - SearchJobsVM
EditJob - EditJobVM

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

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

我还想让我的MainWindow中的一些选项卡不可见 . 选项卡绑定到MainWindowVM中的Visibility属性

我能够获得双击的行的id

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

如何从 SearcvhJobVM 访问 MainWindowVMEditJobVM 的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 回答

  • 1

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

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

    编辑 . 我会在您的子视图中使用DataTemplates,在MainView中使用contentPresenter . 但您也可以使用TabControl并设置Visibility

    <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
    

相关问题