1

我有一个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;
4

2 回答 2

1

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

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

此外,视图模型不应该知道任何关于 TreeViewItems 的信息——它应该对绑定到树中每个项目的模型类进行操作。

于 2013-08-05T13:50:30.660 回答
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....
}
于 2013-08-05T18:56:44.513 回答