2014-10-08 37 views
1

我有我的WPF項目設置如下WPF - 訪問家長的DataContext

在我的主窗口,我有一些標籤。一個SearchJob標籤和編輯工作標籤,標籤顯示它們各自的用戶控制

他們都有自己的ViewModels作爲自己的DataContext

MainWindow - MainWindowVM 
SearchJobs - SearchJobsVM 
EditJob - EditJobVM 

後,我找工作,我得到一個網格回到綁定對工作的一個ObservableCollection對象

當我雙擊結果網格我要讓編輯選項卡可見通過它的視圖模型我雙擊上

行的ID我也想拍一些標籤在我的MainWindow中看不見。該標籤綁定到能見度特性在我MainWindowVM

我能夠得到我雙擊上

我的問題行的ID是從SearchJobsVm我需要訪問機器人的MainWindowVM設置能見度性能也訪問EditJobVM設置ID

如何從SearcvhJobVM訪問MainWindowVMEditJobVM的DataContext的(視圖模型)?

在主窗口我設置的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> 

我的DataContext for EditJobView設置爲: -

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

如何視圖模型被實例化並綁定到用戶控件?添加一些代碼來解釋。 – kennyzx 2014-10-08 04:35:48

+0

有更新我的清單 – David 2014-10-08 05:09:38

回答

1

簡單的方法是,MainVM保存SearchJobsVM和EditJobVM的兩個實例。現在,MainVM可以簡單地處理所有的東西。

例如,SearchJobVM爲您的doubleclick東西公開一個事件。 MainVM訂閱此事件並將Id從Eventargs提供給EditJobVM,並將當前工作空間設置爲EditJobVM。

編輯。我會爲您的子vms和MainView中的contentPresenter使用DataTemplates。但你也可以使用一個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 
+0

我最初沿着你的建議讓MainVM有一個代碼中的其他虛擬機的實例,但我發現其他虛擬機的構造函數被調用兩次,一次是我的實例實例化一次,因爲它是由XAML創建的。因此,我結束了兩個線程。這種方法會糾正嗎? – David 2014-10-08 05:33:16

+0

如果它被調用兩次,那麼你稱它兩次。你應該看看你的代碼爲什麼會發生這種情況。我會建議它必須做與。 – blindmeis 2014-10-08 07:02:54

+0

好的 - 我會提出你的建議並回報 – David 2014-10-09 00:09:58