我有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;
答案 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....
}