Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wpfmvvm中的动态TabControl_C#_Wpf_Xaml_Tabcontrol_Tabitem - Fatal编程技术网

C# wpfmvvm中的动态TabControl

C# wpfmvvm中的动态TabControl,c#,wpf,xaml,tabcontrol,tabitem,C#,Wpf,Xaml,Tabcontrol,Tabitem,几周前我开始使用WPF(在C#中),现在我需要一些关于tabcontrol高级使用的帮助 首先,我使用MVVM(Model-View-ViewModel)模式来设计我的应用程序,我有一个限制,就是尽量不在代码隐藏文件(inititalisexaml文件)中添加代码 现在我的问题是在我的主窗口视图(Window)中动态创建新的tabItems,当我点击一个按钮(“new Tab”按钮)时,它会显示我的详细视图(页面)的一个实例 我在网上找到了很多关于动态创建的东西,但是经常会在代码隐藏文件中进行修

几周前我开始使用WPF(在C#中),现在我需要一些关于tabcontrol高级使用的帮助

首先,我使用MVVM(Model-View-ViewModel)模式来设计我的应用程序,我有一个限制,就是尽量不在代码隐藏文件(inititalisexaml文件)中添加代码

现在我的问题是在我的主窗口视图(Window)中动态创建新的tabItems,当我点击一个按钮(“new Tab”按钮)时,它会显示我的详细视图(页面)的一个实例


我在网上找到了很多关于动态创建的东西,但是经常会在代码隐藏文件中进行修改。我想使用绑定,但我不知道如何对这类东西使用绑定。

您可以绑定到表示选项卡项集合的
TabControl
属性的
ItemsSource
。然后,您可以从ViewModel中操作集合。

MVVM将帮助您解决此问题

为主窗口视图创建视图模型。你可以在那里收藏 详细视图模型。只需在此处使用DetailViewModels的
ObservableCollection

在您的视图中,将
TabControl
ItemsSource
绑定到该集合

AddTab按钮可以具有命令绑定。该命令可以是
ICommand
在MainWindowViewModel中发布的派生类。按下按钮 然后在主窗口ViewModel中结束,添加另一个DetailViewModel和 以这种方式更新视图

请在此处查看MVVM上的优秀视频教程:

他解释了如何实现这一点,并举例说明了主要视图模型和详细视图模型 和命令

他在视频中开发的源代码可在此处获得:

也许创建刚刚使用的ViewModel更容易 通过
选项卡Control
。将
TabControl
DataContext
设置为该值 TabControlViewModel。将该TabControlViewModel发布到 MainWindowViewModel作为公共属性,以实现这一点

您的代码将是空的,可能除了一些初始化组件。

Sacha Barber关于MVVM的大量文章包含可下载的应用程序,他在其中公开了使用tab控件创建动态视图的方法。您可以下载本文附带的演示应用程序,了解如何使用动态选项卡控件。 例如:

您需要在哪里绑定表示选项卡内容的数据模型的工作区集合,如果需要,还需要为选项卡添加属性,例如是否可关闭、是否已禁用、名称等。这可以是您的ViewModelBase。创建选项卡项模板以支持视图模型

<TabControl x:Name="tabControl"
                 IsSynchronizedWithCurrentItem="True" 
                 ItemsSource="{Binding Path=Workspaces}" 
                 Template="{StaticResource DynamicTabControlTemplate}">         
</TabControl>

初始化工作区集合,例如

工作空间=新的ObservableCollection()


在您向“收藏”选项卡添加新项目后,控件也将更改。

您使用了什么进行绑定?已更改依赖项属性或InotifyProperty。Personnal目前我在项目中使用第二个,但我仍然不知道哪一个更好。只要可能,我就使用
INotifyPropertyChanged
。我已经对代码进行了修改,效果很好。当我点击“新建选项卡”按钮时,会出现一个新选项卡,但在该选项卡中,我看不到我的详细信息视图,而是一个带有我的详细信息视图模型名称的文本行。我想我已经忘记了DetailView中的datacontext,但是没有。所以我不知道。你有什么想法吗?你的DetailView应该是什么样子?目前我也不知道。我的详细视图是某种形式。带有标签、文本字段和按钮的网格。