2013-08-05 3 views
1

У меня есть View Model, который управляет Tree View. Также в моем графическом интерфейсе находится Tab Control, который не контролируется View Model. Если я хочу использовать Tree View для доступа к элементам Tab Control, как бы я дал свой View Model доступ к нему (Tab Control)?Получение доступа к элементу управления Tab в классе модели модели

Я предполагаю, что это будет что-то вроде того, как я передаю выбранный элемент из Tree View от кода до View Model.

Code-Behind:

//Gets selected item in TreeView 
private void Tree_One_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
     MainWindowViewModel.SelectedItem = e.NewValue as TreeViewItem; 
} 

View Model:

public static TreeViewItem SelectedItem { get; set; } //Selected Node\ 

Моя текущая попытка

Code-Behind:

MainWindowViewModel.middleControl = tabControl1 as TabControl; 

View Model:

public static TabControl middleControl { get; set; } 

Следующая не работает, потому что View Model до сих пор не видит какой-либо из элементов внутри Tab Control

if (parent_Node.Items.Contains(SelectedItem)) 
       middleControl.SelectedIndex = nameOfTabItem; 

ответ

1

Если вы хотите получить доступ к элементам просмотра из других классов проекта, вы можете запросить окно. Когда мои SelectedItem меняют, я вызываю функцию в моем View Model, которая запрашивает окно, а затем переходит к выполнению операций.

Да - я знаю, что это не правильно. MVVM Этикет, но он работает, и он предоставляет решение моего вопроса.

Code-Behind:

//Gets selected item in TreeView 
private void Tree_One_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
     MainWindowViewModel.SelectedItem = e.NewValue as TreeViewItem; 
     MainWindowViewModel.changeTab(); 
} 

View Model:

//Controls the changing of tabs, corresponding with the selected TreeViewItem 
public static void changeTab() 
{ 
    //Query for Window1 
    var mainWindow = Application.Current.Windows 
     .Cast<Window1>() 
     .FirstOrDefault(window => window is Window1) as Window1; 

    //Change selected tab item 
    if (parent_Node.Items.Contains(SelectedItem)) 
     mainWindow.TabItem.IsSelected = true; 

    //other operations.... 
} 
1

модели представления не следует использовать элемент управления Tab непосредственно. Вся цель архитектуры MVVM - разделение пользовательского интерфейса и бизнес-логики. Только представление должно получить доступ к элементам управления в пользовательском интерфейсе, и даже тогда это редко необходимо из-за привязки данных и логики в модели представления.

Почему элемент управления вкладкой не управляется моделью просмотра?

Также модель представления ничего не должна знать о TreeViewItems - она ​​должна работать с классом модели, который привязан к каждому элементу в дереве.

+0

Параметр 'Вкладка control' не управляется' зрения model', потому что я использовал окно конструктора для создания и место на нем предметы , Я думаю, было бы намного сложнее создать такой подробный «tab control» с моделью. –

+2

@EricAfterDark См. [Мой ответ] (http://stackoverflow.com/a/17954320/643085) о том, как работать с TabControl в MVVM. –

+0

@Ericafterdark. С помощью MVVM с помощью MVCM более сложно использовать элемент управления вкладками, чем управление деревом или списком, но это можно сделать. Ответ HighCore описывает процесс довольно хорошо. – Andy

Смежные вопросы