mvvm - 在TabControl的每个选项卡上,wpf不同的视图/usercontrol

  显示原文与译文双语对照的内容
113 5

我正在尝试编写一个使用制表符来保存不同控件的程序。我现在想要发生的是用户单击一个查找按钮,创建一个新的选项卡,并在它的中显示一个。用户可以使用查找屏幕选择客户端,然后在自己的新标签中打开,允许用户编辑它们。因此,如果用户进入并选择三个客户端,屏幕将有4 个标签,一个用于查找屏幕,三个客户。当用户在该选项卡上单击exit按钮时,它还需要关闭选项卡。

我的问题是,我不确定如何在我的程序中设置这个。创建了TabControl并将ItemsSource绑定到 viewmodels ( 我可以在用户添加新屏幕时添加) 集合。我可以以使用,来选择包含正确视图的arraylist,但是我不知道如何将视图的资源设置为。

我在WPF中进行这项操作,目前正在使用Bxf将viewmodels放入视图中,但这通常是不确定的。

我试图坚持MVVM所以在我的viewmodel中拥有一个视图列表。

之前有谁做过类似的事情?

时间:原作者:0个回答

108 4

我将使我的主视图看起来像这样:

  • ObservableCollection<ViewModelBase> OpenTabs
  • ICommand AddTabCommand
  • ICommand CloseTabCommand

在构造函数中创建了一个新的SearchViewModel,并将它的添加到 OpenTabs 中,并且它的Search 方法在 MainViewModel

MainViewModel 中处理搜索命令的方法将使用指定的客户创建新的CustomerViewModel,设置为 CloseCommand,然后将它的添加到服务器。

var vm = new CustomerViewModel(customer);
vm.CloseCommand = this.CloseTabCommand;
OpenTabs.Add(vm);

你还可以以使用一个事件系统,例如 EventAggregator 或者galasoft的Messenger 来传递 addtab/closetab事件而不是从 MainViewModel 挂钩命令。

当然,使用 DataTemplates 来定义每个 OpenTab 对象在视图中的显示方式

<TabControl ItemsSource="{Binding OpenTabs}">
 <TabControl.Resources>
 <DataTemplate DataType="{x:Type local:SearchViewModel}">
 <local:SearchView/>
 </DataTemplate>
 <DataTemplate DataType="{x:Type local:CustomerViewModel}">
 <local:CustomerView/>
 </DataTemplate>
 </TabControl.Resources>
</TabControl>
原作者:
114 3

我刚刚回答了自己的问题。

动态创建的tabitems是通过 tabcontrols itemsource属性中的单个项的datacontext设置的,在本例中是一个 viewmodels 。

使用datatemplate正确为viewmodel类型选取正确的视图,并显示。

但是我的视图将视图的datacontext设置为我的资源,因此没有显示任何内容。为了使用datacontext而不是资源,我已经更改了它,现在一切都正常了。

所以我的主要问题是让我的视图运行在资源之外而不是 datacontext 。我仍然希望使用资源,但作为datacontext工作,我将不得不使用。

原作者:
...