Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 如何使用MVVM在wpf中以编程方式在选项卡项中添加控件_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何使用MVVM在wpf中以编程方式在选项卡项中添加控件

C# 如何使用MVVM在wpf中以编程方式在选项卡项中添加控件,c#,wpf,mvvm,C#,Wpf,Mvvm,我已经创建了一个tab控件并动态创建了tabItems,但是我不知道如何使用MVVM将控件添加到tabItems中。谁能帮我一下吗?如果你使用mvvm,你不必添加控件。您只需为要显示的viewmodel对象创建数据模板 您所需要的只是一个绑定到viewmodel的contentcontrol/presenter,datatemplate将显示您想要的内容。有几种方法可以通过编程方式在WPF中添加选项卡项,我将向您展示一个简单的示例,说明如何在我的应用程序中处理此问题 首先,我在myMainWin

我已经创建了一个tab控件并动态创建了tabItems,但是我不知道如何使用MVVM将控件添加到tabItems中。谁能帮我一下吗?如果你使用mvvm,你不必添加控件。您只需为要显示的viewmodel对象创建数据模板


您所需要的只是一个绑定到viewmodel的contentcontrol/presenter,datatemplate将显示您想要的内容。

有几种方法可以通过编程方式在
WPF
中添加选项卡项,我将向您展示一个简单的示例,说明如何在我的应用程序中处理此问题

首先,我在my
MainWindowViewModel.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。。。。数据模板用所需的数据填充
。具体说明要求。。。在你的问题上畅所欲言