访问View Model类中的Tab控件

时间:2013-08-05 13:47:03

标签: c# wpf mvvm treeview tabcontrol

我有View Model来控制Tree View。在我的GUI中,Tab Control也不受View Model的控制。如果我想使用Tree View来访问Tab Control的元素,我将如何对View Model Tab Control进行访问?

我猜这将是如何将Tree View中的选定项目从代码隐藏传递到View Model

代码隐藏:

//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\

我当前的尝试

代码隐藏:

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;

2 个答案:

答案 0 :(得分:1)

视图模型不应直接使用Tab控件。 MVVM体系结构的整个目的是分离UI和业务逻辑。只有视图才能访问UI中的控件,即使这样,由于数据绑定和视图模型中的逻辑,这也很少需要。

为什么选项卡控件不受视图模型管理?

视图模型也不应该知道有关TreeViewItems的任何信息 - 它应该在绑定到树中每个项目的模型类上运行。

答案 1 :(得分:1)

如果要访问项目中其他类的视图元素,可以查询窗口。当我的SelectedItem更改时,我调用View Model中查询窗口的函数,然后继续执行操作。

是的 - 我知道这不是正确的MVVM礼仪,但它有效,它提供了我的问题的解决方案。

代码隐藏:

//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....
}