C# 如何使用MVVM在wpf中以编程方式在选项卡项中添加控件
我已经创建了一个tab控件并动态创建了tabItems,但是我不知道如何使用MVVM将控件添加到tabItems中。谁能帮我一下吗?如果你使用mvvm,你不必添加控件。您只需为要显示的viewmodel对象创建数据模板C# 如何使用MVVM在wpf中以编程方式在选项卡项中添加控件,c#,wpf,mvvm,C#,Wpf,Mvvm,我已经创建了一个tab控件并动态创建了tabItems,但是我不知道如何使用MVVM将控件添加到tabItems中。谁能帮我一下吗?如果你使用mvvm,你不必添加控件。您只需为要显示的viewmodel对象创建数据模板 您所需要的只是一个绑定到viewmodel的contentcontrol/presenter,datatemplate将显示您想要的内容。有几种方法可以通过编程方式在WPF中添加选项卡项,我将向您展示一个简单的示例,说明如何在我的应用程序中处理此问题 首先,我在myMainWin
您所需要的只是一个绑定到viewmodel的contentcontrol/presenter,datatemplate将显示您想要的内容。有几种方法可以通过编程方式在
WPF
中添加选项卡项,我将向您展示一个简单的示例,说明如何在我的应用程序中处理此问题
首先,我在myMainWindowViewModel.cs中为选项卡项
(或我所指的工作区
)托管了一组视图模型
:
private ObservableCollection<WorkspaceViewModel> _workspaces;
public ObservableCollection<WorkspaceViewModel> Workspaces
{
get
{
if (_workspaces == null)
{
_workspaces = new ObservableCollection<WorkspaceViewModel>();
}
return _workspaces;
}
}
如果您有多种类型的用户控件,只需将它们全部添加到此处,如下所示:
<Window.Resources>
<DataTemplate DataType="{x:Type vm:FirstUserControlViewModel}">
<vw:FirstUserControlView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SecondUserControlViewModel}">
<vw:SecondUserControlView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ThirdUserControlViewModel}">
<vw:ThirdUserControlView/>
</DataTemplate>
</Window.Resources>
public abstract class WorkspaceViewModel : BaseViewModel
{
public String HeaderText { get; set; }
public override string ToString()
{
return HeaderText;
}
}
private ResourceDictionary _viewDictionary = new ResourceDictionary();
public ResourceDictionary Dict
{
get
{
return _viewDictionary;
}
}
_viewDictionary.Source =
new Uri("/MyExtension.Test;component/View.xaml",
UriKind.RelativeOrAbsolute);
然后我只需将我的ViewModels
添加到集合中,让它们显示在TabControl
中
Workspaces.Add(new FirstUserControlViewModel());
Workspaces.Add(new SecondUserControlViewModel());
Workspaces.Add(new ThirdUserControlViewModel());
我的WorkspaceViewModel
是TabItem
集合的基础,它非常简单,看起来像这样:
<Window.Resources>
<DataTemplate DataType="{x:Type vm:FirstUserControlViewModel}">
<vw:FirstUserControlView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SecondUserControlViewModel}">
<vw:SecondUserControlView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ThirdUserControlViewModel}">
<vw:ThirdUserControlView/>
</DataTemplate>
</Window.Resources>
public abstract class WorkspaceViewModel : BaseViewModel
{
public String HeaderText { get; set; }
public override string ToString()
{
return HeaderText;
}
}
private ResourceDictionary _viewDictionary = new ResourceDictionary();
public ResourceDictionary Dict
{
get
{
return _viewDictionary;
}
}
_viewDictionary.Source =
new Uri("/MyExtension.Test;component/View.xaml",
UriKind.RelativeOrAbsolute);
添加选项卡项:
要创建一个TabItem
,只需像通常使用WPF和MVVM模式那样创建一个UserControl
和ViewModel
namespace MyApplication.ViewModel
{
public class FirstUserControlViewModel : WorkspaceViewModel
{
public FirstUserControlViewModel ()
{
base.HeaderText = "My First Tab";
}
}
}
接下来,您需要将视图
绑定到新的视图模型
<DataTemplate DataType="{x:Type vm:FirstUserControlViewModel }">
<vw:FirstUserControlView/>
</DataTemplate>
FirstUserControlViewModel firstvm = new FirstUserControlViewModel();
Workspaces.Add(firstvm);
现在,TabItem
应该显示在TabControl
中
Workspaces.Add(new FirstUserControlViewModel());
Workspaces.Add(new SecondUserControlViewModel());
Workspaces.Add(new ThirdUserControlViewModel());
使用扩展动态加载选项卡项:
在某些情况下,您甚至可能需要从插件动态加载TabItems
,而主机应用程序首先不知道TabItem
。在这些情况下,您需要让插件向应用程序域注册视图
和视图模型
这是非常容易做到的,实际上是我为一个基于MEF
的项目所做的。我有一个帖子,还有一些额外的细节
你所需要做的就是在你的插件/扩展中添加一个资源字典
,并确保主机应用程序在导入插件后加载它
为了向您展示一个快速示例,我的扩展中有一个View.xaml
:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vw="clr-namespace:MyExtension.Test">
<DataTemplate DataType="{x:Type vw:TestViewModel}">
<vw:TestView/>
</DataTemplate>
</ResourceDictionary>
最后使用Application.Current.Resources.MergedDictionaries.Add
将View.xaml加载到主机中。不必添加控件,只需指定UserControl即可
TabControl有两个属性ItemTemplate
&&Content-Template
ItemTemplate用于显示选项卡的外观
ContentTemplate是选项卡内容的外观。。。所以
Xaml用于上述
在“使用MVVM将控件添加到选项卡项”下,您是什么意思?您需要在那里添加一些控件吗?每个选项卡上的控件是否相似(不是内容)?我需要使用mvvm@Tanya我的解决方案应该能让你做到这一点。如果您有任何问题,请添加注释:使用MVVM
动态地将项目添加到View
是不对的。谷歌it:。有很多答案。addin控件动态与mvvm无关。你能具体说明你的需要吗?如果您希望选项卡页根据datacontext(viewmodel/viewmodel属性)的不同而不同,则只需使用DataTemplate即可在数据模板中添加组件您希望执行的操作。。。。将控件添加到userControl。。。。数据模板用所需的数据填充
。具体说明要求。。。在你的问题上畅所欲言