将 TabItem 添加到现有 TabControl WPF/MVVM

2023-12-07

I have TabControl已经定义了一些TabItems on XAML。我需要创建新的TabItems并添加到其中。

如果我使用ItemSource我得到一个例外Items collection must be empty before using ItemsSource.

到目前为止我找到的解决方案是创建那些TabItems我已经定义了XAML但以编程方式在 ViewModel 上,这样我就可以创建我真正需要的其他内容,但这似乎不是一个好的解决方案。

其他解决方案是添加TabControl作为属性并使用代码隐藏将其绑定到 ViewModel,这是我想避免的。

所以,我只是想知道是否有办法只用XAML和MVVM。

Edit:

ItemSource 尝试,正在运行。

XAML:

<TabControl Grid.Row="1"
        Grid.Column="0"
        VerticalAlignment="Stretch"
        BorderThickness="0.5"
        BorderBrush="Black"
        ItemsSource="{Binding Model.TabItems, Mode=TwoWay}">
    <!--<TabControl.Items>
    </TabControl.Items>-->
</TabControl>

Model

public ObservableCollection<TabItem> TabItems {get;set;}

VM

TabItem tabItem = new TabItem { Content = new DetailedViewModel((MyObject)inCommandParameter) };
Model.TabItems.Add(tabItem);

你在这里做的是NOTMVVM。其背后的想法是使应用程序的各个部分保持独立,即模型不应返回任何 UI 元素。例如,如果您想将其与任何其他 UI 框架一起使用WinForms那么它就会失败并且需要额外的工作。
您需要的是这样的东西,请记住,这是一个示例,您需要对其进行修改以满足您的要求。
型号类别:

namespace Model
{
    public class Profile
    {
        public string Name { get; set; }

        public static int I { get; set; } = 2;
    }
}  

之后您将需要 ViewModel:

namespace VM
{
    public class MainViewModel : BaseViewModel
    {
        public MainViewModel()
        {
            ProfilesCollection = new List<Profile>();
            for (int i = 0; i < 100; i++)
            {
                ProfilesCollection.Add(new Profile() {Name = $"Name {i}"});
            }
        }

        private List<Profile> profilesCollection;   

        public List<Profile> ProfilesCollection
        {
            get { return profilesCollection; }
            set { profilesCollection = value; OnPropertyChanged(); }
        }
    }
}  

现在我们有了可以合作的基础。之后,我假设您知道如何在 xaml 中添加相关引用,但这可能会被其他人看到,所以我无论如何都会包含它。
这是一个完整的MainWindow.xaml:

<Window x:Class="SO_app.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:VM;assembly=VM"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:converter="clr-namespace:SO_app.Converters"
    xmlns:validation="clr-namespace:SO_app.Validation"
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    xmlns:local="clr-namespace:SO_app"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:model="clr-namespace:Model;assembly=Model"//reference to my model
    mc:Ignorable="d"
    Title="MainWindow" Height="452.762" Width="525" Closing="Window_Closing">
<!-- d:DataContext="{d:DesignInstance Type=vm:MainViewModel, IsDesignTimeCreatable=True}" -->
<Window.Resources>
    <CollectionViewSource Source="{Binding ProfilesCollection}" x:Key="profiles"/> // this corresponds to our collection in VM
</Window.Resources>
<Window.DataContext>
    <vm:MainViewModel/>//Data Context of the Window
</Window.DataContext>

<Window.Background>
    <VisualBrush>
        <VisualBrush.Visual>
            <Rectangle Width="50" Height="50" Fill="ForestGreen"></Rectangle>
        </VisualBrush.Visual>
    </VisualBrush>
</Window.Background>
<TabControl>
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type model:Profile}">//this data template will be used by the TabControl
            <Grid>
                <TextBlock Text="{Binding Name}"/>
            </Grid>
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemsSource>
        <CompositeCollection>
            <TabItem Header="First Item"/>
            <TabItem Header="SecondItem"/>
            <CollectionContainer Collection="{Binding Source={StaticResource profiles}}"/>
        </CompositeCollection>
    </TabControl.ItemsSource>
</TabControl>


如果你想添加更多项目,那么只需使用将在虚拟机中实现的命令,然后添加profile并享受表演。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 TabItem 添加到现有 TabControl WPF/MVVM 的相关文章

  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • 当一对迭代器初始化时,向量是否知道先保留?

    考虑以下代码 struct MyData MyData const BYTE pData size t uSize bucket pData pData uSize std vector
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C

随机推荐

  • 将儒略日转换为日/月/年

    我的帖子显然不清楚 所以我正在努力修复它 如果我仍然不清楚 请随时告诉我 我得到了一个物理变量的数据框 每分钟都有一个数据 我想将前 4 列转换为单个列 R 中的 d m Y H M GMT Year Julian day Hour Min
  • 如果 Visual Studio 2012 / 2013 中的项目/解决方案中缺少文件,则报告错误/警告

    视觉工作室不再支持宏 因此以下问题中的答案仅对以前的版本有效 如果 Visual Studio 中的项目 解决方案中缺少文件 则报告错误 警告 当您构建缺少文件的解决方案时 Visual Studio 2012 2013 是否可以报告错误
  • 在目标包含源的情况下使用 strncpy()

    我用 C 编写了一个函数来修剪字符串中的空白字符 我关心的是最后一行trim 下面的函数 其中源包含在目标中 测试用例以及其他一些测试结果都很好 复制源和目标位于同一内存中的字符串的全部或部分会导致奇怪的问题吗 源代码 include
  • ORM 学说中的 Substring_index 函数

    我必须使用SUBSTRING INDEXsymfony 2 中的学说 ORM 函数 我该怎么做 现在在查询中使用它会出现未定义的函数错误 Syntax Error line 0 col 299 Error Expected known fu
  • Django:模板中的嵌套变量

    在我的 django 登录模板之一中 有一行
  • 将 ImageData 对象(不是画布)转换为图像 dataURL

    我想从 ImageData 对象 即宽度 高度 数据 创建 dataURL 我意识到画布有这个 但我想避免扭曲画布使用 主要是alpha预乘 即我想避免明显的canvas putImageData步骤 From 这个帖子我可以将任何 arr
  • TensorFlow 图内复制示例

    我想在具有多个 ps 和工作线程的多 GPU 集群中试验 TensorFlow 的图内复制 这CIFAR 10 多 GPU 示例图中显示了单台机器上的同步复制 有没有可用的示例可供我参考 例如图间训练的示例训练程序 一般来说 对于分布式训练
  • 如何在 WSO2 Micro Integrator 中跳过 CSV 文件中的标题

    我正在使用 smooks mediator 使用 VFS 将 csv 文件转换为 json 我们可以选择在使用 CSV 连接器 模块时跳过标题行 使用 smooks 在 WSO2 Integration studio 中处理文件时如何跳过第
  • 如何获取每个外键的最小日期记录的记录 ID?

    我有下表 recordID createdDate ForeignKeyID 00QA000000PtFXaMAN 2012 01 03 13 23 36 000 001A000000ngM21IAE 00QA000000OS2QiMAL
  • REST Web api URL GET 使用字符串而不是 id 未按预期路由

    我有以下示例 其中请求是http domain api foo username 但我收到了 404 状态代码 此控制器上不存在其他 Get 操作 这不应该起作用吗 public class FooController ApiControl
  • 使用 Swift 进行水平滚动

    我怎样才能找到教程或其他东西来帮助我创建这样的东西可滚动的下图中使用 Swift 标记的区域 谢谢 None
  • 如何使用vbs或批处理脚本在特定时间关闭电脑

    我想要一个脚本放在启动文件夹中并且不使用任务计划程序 If time gt 22 00 hrs shutdown if startup after 10pm Shutdown s f break While time 22 00hrs lo
  • 使用 JavaFx Scene Builder 2.0 “全屏”同时显示两个窗口

    我正在开发一个迷你应用程序 我需要在全屏上同时向用户显示 2 个窗口 该应用程序将为双屏用户制作 我正在 NetBeans 8 0 1 上使用 JavaFx Scene Builder 2 0 我尝试了这个 但只有第二个窗口显示在全屏上 p
  • 当另一个表中值为 null 时重定向到页面 laravel

    如果我的additional infos 表包含一些在本例中为空的内容 联系人 姓名和地址 我会尝试将用户重定向到另一个页面 我现在已经做了类似的事情 但即使联系人 姓名和地址已填写 它仍然将我重定向到另一个页面 有人能帮我吗 提前致谢 p
  • 在 R 循环中命名文件

    我有多个音频文件 它们保存在我的工作目录中的几个子文件夹中 我有一个循环 它读取每个文件的第一分钟 然后将它们保存为新文件 library tuneR dir create New files FILES lt list files PAT
  • 在循环中调用 utl_file.put 时 UTL_FILE.WRITE_ERROR

    我的 PL SQL 过程中有以下代码 我在 API XXX put 中调用了它 它调用utl file put 在 while 循环中 l xmldoc 是来自 getReportXML 函数的 CLOB 该函数返回 xml clob 我编
  • Android 首选项:当用户未使用首选项屏幕时如何加载默认值?

    我正在使用 PreferenceActivity 让用户设置一些值 我正在向它提供具有定义的首选项的 xml 文件 我已经设置了所有android defaultValue 对于他们来说 当我启动应用程序时 我需要首选项 或者如果尚未手动设
  • 简化自然色的漂亮印刷

    假设我编写了一个用于反转列表的函数 我想用value命令 只是为了向自己保证我可能做对了 但输出看起来很糟糕 value reverse 1 8 3 gt 1 1 1 1 1 1 1 1 1 1 1 1 a list 如果我告诉伊莎贝尔将这
  • attr 作为 css 选择器中的属性[重复]

    这个问题在这里已经有答案了 可能的重复 按样式属性的 CSS 选择器 html div div 在CSS中我想使用这个家庭值 例子 div font family attr data family Family 可以是任何字符串 如何让它发
  • 将 TabItem 添加到现有 TabControl WPF/MVVM

    I have TabControl已经定义了一些TabItems on XAML 我需要创建新的TabItems并添加到其中 如果我使用ItemSource我得到一个例外Items collection must be empty befo