2014-10-08 3 views
1

У меня есть проект WPF, созданный следующим образом:WPF - Доступ к родительскому DataContext

В моем MainWindow у меня есть несколько вкладок. Вкладка SearchJob и вкладка Edit Job, вкладки отображаются их собственный соответствующий пользователь управляет

Все они имеют свои собственные ViewModels как их DataContext

MainWindow - MainWindowVM 
SearchJobs - SearchJobsVM 
EditJob - EditJobVM 

После Я ищу работу Я получаю сетки обратно, который связан Ань ObservableCollection Иова объектов

Когда я дважды щелкните таблицу результатов я хочу сделать вкладку Edit видимым передавая это вид модели идентификатор строки я дважды нажал на

Я также хочу, чтобы сделать некоторые из вкладки в моем MainWindow невидимом. Вкладки обязаны Видимость свойств в моем MainWindowVM

Я могу получить идентификатор строки, я дважды нажал на

Мой вопрос в том, что из SearchJobsVm мне нужно, чтобы получить доступ бота MainWindowVM установить видимость свойства, а также доступ к EditJobVM установить ID

Как получить доступ к DataContext (вид модели) в MainWindowVMEditJobVM и от SearcvhJobVM?

В MainWindow я поставил DataContext так: -

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

и пользовательские элементы управления добавляются в XAML как так

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

Мой DataContext для SearchJobView устанавливается как: -

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

My DataContext для EditJobView установлен как: -

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

Как просмотреть модели инстанцируются и связаны с пользовательскими элементами управления? добавьте код для объяснения. – kennyzx

+0

У меня обновлено мое объявление – David

ответ

1

простой способ заключается в том, что MainVM удерживает оба экземпляра вашего SearchJobsVM и EditJobVM. теперь MainVM может просто обрабатывать все вещи.

например, SearchJobVM выставляет событие для вашего материала с двойным щелчком. MainVM подписываются на это событие и передают Id из eventargs в EditJobVM и устанавливают текущее рабочее пространство в EditJobVM.

EDIT. я бы использовал DataTemplates для вашего дочернего vms и contentPresenter в MainView. но вы также можете использовать 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 есть экземпляр обоих других VM в коде, как вы предлагаете, но я обнаружил, что конструктор других виртуальных машин вызывается дважды, один для экземпляра, который я был экземпляр и один раз, потому что он был создан XAML. Следовательно, у меня было два потока. Будет ли этот подход исправлять это? – David

+0

, если он вызывается дважды, вы вызываете его дважды. вы должны посмотреть на свой код, почему это происходит. я бы предположил, что это связано с . – blindmeis

+0

Хорошо - я дам ваше предложение пойти и отчитаться – David