WPF MVVM 在代码后面绑定动态控件并传入View

2024-01-16

我正在使用 MVVM 开发 WPF 应用程序。我有两页。我在第 1 页中有多个 UserControl,在从第 1 页选择 UserControl 时,我想在第 2 页中显示所选的 userControl。下面是我的代码。

视图模型代码

public RelayCommand<string> OnClickSelectWidgetCommand => new RelayCommand<string>((setUserControlName) =>
    {
        using (new CursorWait())
        {
            var MyContentControl = setUserControlName;
            MessageBox.Show(MyContentControl);

            //How to render UserControl to View?
        }

    }, true);

在上面的代码中,我得到了 UserControl 名称设置用户控件名称多变的。现在如何将该 UserControl 绑定到 XAML 页面?以下是我尝试过的代码。

查看代码

<StackPanel Background="Black" VerticalAlignment="Top">
<Border Name="UserControl1BorderLow" BorderBrush="White" BorderThickness="0" >
    <ItemsControl ItemsSource="{Binding LowCollection}" Margin="4,0" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel HorizontalAlignment="Left" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <controls:UserControlColumn1XL HorizontalAlignment="Left" Margin="2" />
                <!--what can I do here in above line to make it dynamically render the userControl in place of UserControlColumn1XL-->
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Border></StackPanel>

上面的代码,在 DataTemplate 中需要更改什么才能动态绑定 UserControls?


有两种方法可以解决此问题,一种是根据数据类型设置模板 (DataTemplates),另一种是根据数据本身设置模板 (DataTriggers)。

在第一种情况下,您的 LowCollection 应该是一个对象数组,或者是您的视图模型全部派生自的某个基类(ViewModel1、ViewModel2 等)。在这种情况下,您可以完全删除 itemtemplate,只需添加 DataTemplates 来指定 ItemsControl 中的每个项目应如何表示:

<ItemsControl.Resources>

    <DataTemplate DataType="{x:Type local:ViewModel1}">
        <UserControl1 />
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:ViewModel2}">
        <UserControl2 />
    </DataTemplate>

    ... etc...

在第二种情况下,您需要根据视图模型中某些属性的值设置模板。在这种情况下,您确实需要设置 ItemTemplate,并为其指定一个 Style,该 Style 使用数据触发器来设置适当的 DataTemplate:

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding}">
                <ContentPresenter.Style>
                    <Style TargetType="{x:Type ContentPresenter}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding YourProperty}" Value="YourValue1">
                                <Setter Property="ContentTemplate" Value="{StaticResource YourDataTemplate1}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding YourProperty}" Value="YourValue2">
                                <Setter Property="ContentTemplate" Value="{StaticResource YourDataTemplate2}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentPresenter.Style>
            </ContentPresenter>
        </DataTemplate>
    </ItemsControl.ItemTemplate>

这里需要注意的相关部分是视图模型中有一个名为YourProperty它可以有两个值,即YourValue1 or YourValue2;上面的样式然后选择YourDataTemplate1 or YourDataTemplate2,取决于值YourProperty.

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

WPF MVVM 在代码后面绑定动态控件并传入View 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • Android中AAR、JAR、DEX、APK的区别

    在Android系统或开发环境中 AAR JAR DEX APK文件有什么区别 每一项的目的是什么 AFAIK JAR 就像 class 文件的集合 就像 Java 中的那样 AAR 是 JAR 文件 资源 但它的用例是什么 用于分发 An
  • 为什么在 scala Spark 应用程序中初始化 SQLContext 后导入隐式 SqlContext.implicits._

    为什么在 scala Spark 应用程序中初始化 SQLContext 后导入隐式 SqlContext implicits 当导入放在对象之外时 似乎存在问题 我来自 java 背景 不理解 def 对象中 import 语句的用法 v
  • HTTPS 通信是否需要 JWT?

    我正在开发一个 MEAN 堆栈应用程序 目前正在设置一个帐户系统 我看过几个关于身份验证的教程 全部使用JWT 我想知道 JWT 是否可以用作通过非安全连接 如 HTTP 来保护通信传输的方法 我已经设置了 HTTPS 从 Angular
  • Android 通知管理器在屏幕关闭时不起作用

    我有一个倒计时器 当它关闭 到零 时 它会检查应用程序是否具有焦点 如果没有 它会在通知栏中启动通知 当您单击通知时 将重新打开应用程序 现在所有这些都工作正常 但如果屏幕碰巧关闭 计时器会继续运行 并且通知会在正确的时间可用 但在我重新打
  • 如何识别 Teradata 用户的所有权限?

    我正在寻找一种方法来识别授予特定数据库中用户的默认权限 我已经尝试过这个 select from dbc allrights where username user id and databasename database name 上述有
  • 像地址栏一样的资源管理器窗口[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 以与创建相反的顺序处理对象?

    我在编写的代码中遇到一个反复出现的问题 修改某些全局值 我将使用注册表值作为示例 然后尝试将修改恢复到原始状态 我想我会尝试使用 IDisposable 来解决这个问题 创建时 该对象将读取注册表值 将其存储在本地 然后对其进行修改 当被破
  • 以编程方式配置 Eclipse 安装的 JRE

    我想将 Eclipse 环境配置为使用 JDK 而不是标准 JRE 我这样做是因为我使用 m2eclipse 它需要 JDK 中的 tools jar 才能运行 我在 Windows 7 32 位和 JDK 1 6 0 16 上运行 Ecl
  • clang format 可以格式化 C/C++ 函数以在逗号之前打破参数列表吗?

    我注意到你可以做到这一点 From https clang llvm org docs ClangFormatStyleOptions html https clang llvm org docs ClangFormatStyleOptio
  • 为什么 document.body.offsetHeight + document.body.bottomMargin 不等于 document.documentElement.offsetHeight

    我正在尝试计算 iFrame 的高度 但不明白为什么 document body offsetHeight document body bottomMargin 不相等 document documentElement offsetHeig
  • 哈斯克尔空间泄漏

    all 在尝试解决一些编程测验时 https www hackerrank com challenges missing numbers https www hackerrank com challenges missing numbers
  • Postgresql 增量物化视图维护 (IVM) 挑战,为什么再次推迟到目标版本 16? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 来自 commit fest 的最新消息https wiki postgresql org wiki Incremental View Main
  • 在进程启动之前向进程注入 dll 的优雅方法

    我正在制作一个 mod dll 来修改目标进程的行为 我成功地注入了我的dll并挂钩了目标的一些函数 但是 当我需要在主模块启动之前 更清楚地说 在入口点之前 挂钩一些 API 时 需要做更多的工作 我需要使用 CREATE SUSPEND
  • 如何将 270 度旋转的文本对齐到左上角?

    这应该是一个你会想到的非常简单的问题 我有一个带有一些标题文本的框 我想将其旋转 90 度 我希望它是绝对定位的 以便单词的末尾被轻推到左上角 我可以很容易地将其对齐到底部 但问题是 对于可变长度文本 在对齐到顶部时似乎不可能始终将其保留在
  • Java 中的日语字符编码

    这是我的问题 我现在正在使用 Java Apache POI 读取 Excel xls 或 xlsx 文件 并显示内容 电子表格中有一些日语字符 我得到的所有日语字符都是 在我的输出中 我尝试过使用Shift JIS UTF 8等多种编码方
  • 抽象超类中的通用 @Inject'd 字段

    考虑一组类似 MVP 的类型 存在一个抽象的 Presenter 带有一个 View 接口 public interface View public abstract class AbstractPresenter
  • 在 TextView 中省略文本大小而不指定 maxLines

    我有一个 TextView 其高度会根据屏幕中的其他组件而变化 我要在此 TextView 中设置很长的文本 因此我想省略它 简单地指定 android ellipsize end 是行不通的 只有同时指定 maxLines 时 椭圆化才起
  • 将图像序列转换为视频文件 android java

    我知道这是一个老问题 我对此进行了很多研究 但似乎没有适当的解决方案 我已经看到了一些方法可以做到这一点 例如 使用 FFmpeg 但它取决于本机代码 所以对我来说不是一个选择 Xuggler API 与上面的原因相同 我正在寻找可以将多个
  • 如何使用R连接两台计算机?

    是否可以在两台不同计算机上的两个 R 会话之间打开通信流 如果会话位于同一台计算机上 我使用套接字来连接会话 我想对于两台不同的计算机 我应该尝试网络套接字 httpuv支持 R 作为 Web 套接字服务器 但不幸的是 我找不到任何支持 R
  • WPF MVVM 在代码后面绑定动态控件并传入View

    我正在使用 MVVM 开发 WPF 应用程序 我有两页 我在第 1 页中有多个 UserControl 在从第 1 页选择 UserControl 时 我想在第 2 页中显示所选的 userControl 下面是我的代码 视图模型代码 pu