TabControl的每个选项卡上的不同视图/用户控件

时间:2011-08-25 12:46:40

标签: wpf mvvm tabcontrol

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

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

我在WPF中这样做,我现在正在使用Bxf将我的视图模型放入视图中,这通常有效,但我不确定它是如何适应TabControl的。

我正在努力坚持使用MVVM,因此我的viewmodel中有一个视图列表。

以前有人做过类似的事吗?

2 个答案:

答案 0 :(得分:16)

我会让我的主ViewModel看起来像这样:

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

在构造函数中,新的SearchViewModel已创建并添加到OpenTabs,并且Search方法可以与MainViewModel

中的某个方法挂钩

处理搜索命令的MainViewModel中的方法会为指定的客户创建新的CustomerViewModel,将其设置为CloseCommand,然后将其添加到OpenTabs

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

您还可以使用PRISM的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>

答案 1 :(得分:-1)

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

动态创建的tabitems是使用tabcontrols itemsource属性中的单个项目的datacontext设置的,在本例中是我的一个viewmodel。

我使用的datatemplate正确选择viewmodel类型的正确视图并显示它。

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

所以我的主要问题是让我的视图耗尽资源而不是datacontext。我仍然更愿意使用资源,但作为datacontext工作,我将不得不采用它。