为列表框中的每个项目加载不同的数据模板

2023-12-19

我正在尝试创建一个学习应用程序,我想根据问题类型加载数据模板 如下所述。

     If Question Type is TYPE1

     load InstructionTemplate_Type1.xaml
     load ChoiceTemplate_Type1.xaml
     load QuestionTemplate_Type1.xaml

     If Question Type is TYPE2

     load InstructionTemplate_Type2.xaml
     load ChoiceTemplate_Type2.xaml
     load QuestionTemplate_Type2.xaml

     If Question Type is TYPE3

     load InstructionTemplate_Type3.xaml
     load ChoiceTemplate_Type3.xaml
     load QuestionTemplate_Type3.xaml

     else

     load InstructionTemplate_Type3.xaml
     load ChoiceTemplate_Type3.xaml
     load QuestionTemplate_Type3.xaml

我的页面应该看起来像......

有人可以帮助我如何做到这一点。

我正在使用上一篇文章中的代码

WPF 中的嵌套 ObservableCollection 数据绑定 https://stackoverflow.com/questions/20984156/nested-observablecollection-data-binding-in-wpf/20986363?noredirect=1#comment31693208_20986363

xaml 是...

    <learn:SelectedItemIsCorrectToBooleanConverter x:Key="SelectedCheckedToBoolean" />

    <Style x:Key="ChoiceRadioButtonStyle" TargetType="{x:Type RadioButton}" BasedOn="{StaticResource {x:Type RadioButton}}">
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource SelectedCheckedToBoolean}">
                        <Binding Path="IsCorrect" />
                        <Binding RelativeSource="{RelativeSource Self}" Path="IsChecked" />
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="Background" Value="Green"></Setter>
            </DataTrigger>
            <DataTrigger Value="False">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource SelectedCheckedToBoolean}">
                        <Binding Path="IsCorrect" />
                        <Binding RelativeSource="{RelativeSource Self}" Path="IsChecked" />
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="Background" Value="Red"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="InstructionTemplate" DataType="{x:Type learn:Question}">
        <TextBlock Text="{Binding Path=Instruction}" />
    </DataTemplate>

     <DataTemplate x:Key="ChoiceTemplate" DataType="{x:Type learn:Choice}">
                        <RadioButton Content="{Binding Path=Name}" IsChecked="{Binding RelativeSource=   {RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Margin="10 1" 
                                     Style="{StaticResource ChoiceRadioButtonStyle}" />
                    </DataTemplate>

    <DataTemplate x:Key="QuestionTemplate" DataType="{x:Type learn:Question}">
        <StackPanel Margin="10 0">
            <TextBlock Text="{Binding Path=Name}" />
            <ListBox ItemsSource="{Binding Path=Choices}" SelectedItem="{Binding Path=SelectedChoice}" HorizontalAlignment="Stretch" ItemTemplate="ChoiceTemplate">

            </ListBox>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<DockPanel>
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
        <Button Content="Select Question 3 choice 3" Click="ButtonBase_OnClick" />
    </StackPanel>
    <ItemsControl ItemsSource="{Binding Path=Questions}">
        <ItemsControl.ItemTemplateSelector>
            <learn:QuestionTemplateSelector QuestionTemplate="{StaticResource QuestionTemplate}" InstructionTemplate="{StaticResource InstructionTemplate}" />
        </ItemsControl.ItemTemplateSelector>
    </ItemsControl>
</DockPanel>

有人可以帮助我了解如何通过更智能的设计来存档吗 (可能是问题的公共基类,并且为每个问题类型都有派生问题类,并使用类中的虚拟函数加载数据模板...)但我想知道如何使用模板选择器来完成此操作...或者我们需要使用一些不同的方法吗?


如果您创建从常见问题 ViewModel 派生的 ViewModel,您可以创建列表 (ObservableCollection<Question>)。然后使用以下列表框:

<ListBox ItemsSource="{Binding YourQuestionList}">
     <ListBox.Resources>
           <DataTemplate DataType="{x:Type VM:QuestionType1}">
                  ( ... question1 full design ... )
           </DataTemplate>
           <DataTemplate DataType="{x:Type VM:QuestionType2}">
                  ( ... question2 full design ... )
           </DataTemplate>
           ( ... other data templates ... )
</ListBox>

DataContext 将是自定义完整设计中的特定问题视图模型,因此您也可以使用这些属性进行绑定。您需要添加对 ViewModel 所在命名空间的引用(例如:xmlns:VM="clr-namespace:YourApp.VMs")到 xaml 文件的顶部(如果 ViewModel 的命名空间是VMs.

我认为这应该适合你。

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

为列表框中的每个项目加载不同的数据模板 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 如何在列表框中显示字典

    我正在尝试将字典中的键 值对显示到列表框 Key Value A 10 B 20 C 30 我想以以下格式将它们显示在列表框中 A 10 B 20 C 30 使用以下代码我已经能够将 Listbox Datasource 链接到 Dicti
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th

随机推荐

  • C++ 警告:“指针参数“arr”可以是指向 const 的指针”

    我有下面三个函数 我不确定为什么第二个和第三个函数在 arr 处有警告 但第一个函数没有 该警告是什么意思以及如何解决这个问题 IDE 克利翁2017 3 MinGW64 5 0 CMake 3 9 4 谢谢 int getFirstEve
  • Python:psycopg2.ProgrammingError:INSERT 的表达式多于目标列

    我是 python 新手 我似乎不明白为什么会出现这个错误 它告诉我参数太多 但表有 8 列 我向 它传递了 8 个参数 到底是怎么回事 这个错误是否会产生误导 真正的问题是我试图传递的值可能是None或者可以是类型Boolean usin
  • Swift 反射功能 - 如何获取实例变量名称?

    给定一个构造函数 例如 required init pTableName String pRecordKey String pStartAtRecord Int parameters append ChildElement identifi
  • 隐藏Referer(PHP、HTML、JS 无关紧要)

    我正在使用这样的东西 mysite com out php url outurl com 我只是使用一个简单的重定向 但我只是想知道如何隐藏引荐来源网址 Thanks 编辑 我最终进行了两次元刷新 引荐来源网址是由用户的浏览器附加的 而不是
  • 在应用程序购买 SKPaymentQueue finishTransaction 不起作用

    我正在 iOS sdk 中工作应用程序内购买项目 我已经准备好了应用程序内购买类 用于从应用程序商店购买应用程序 并启用项目的内部内容 但是 我的问题是 SKPaymentQueue 没有完成我的类的工作 这是我的应用程序内购买的代码班级
  • Spring Data中的多态查询

    我有一个基本抽象类 Entity Table name P FLD Inheritance strategy InheritanceType JOINED DiscriminatorColumn name FLD DISCRIMINATOR
  • 当应用程序被销毁时 PreferenceActivity 保存首选项

    我有一个 MainActivity 和一个从该 Activity 调用的 PreferenceActivity 我还运行了一个服务来查询这些首选项 当我打印这些值时 我明白了 D pref scrobble 4083 true D pref
  • Git 挂钩,通过提交进行接收后循环

    在服务器端使用 git hooks 是否可以在每次有人推送到远程存储库时循环从客户端发送到服务器的新提交消息 我需要从每条消息中提取信息 哈希 日期 提交作者 分支 我找不到任何关于 git hooks 的好的文档来解决这个问题 我已读完g
  • 保存和读取登录到钥匙串不工作 IOS swift

    Hello I have a log in view that uses face recognition to authenticate the user and If the user is authenticated it reads
  • 矢量图块缓冲区

    我在使用 Geoserver 提供的矢量切片设置 Openlayers 地图时遇到问题 线条沿着瓷砖的边缘拧在一起 看起来线条是先被剪裁 然后再设计样式 而不是相反 这使得宽线看起来很难看 更改 LOL 客户端中的渲染缓冲区不会产生任何影响
  • pandas dataframe groupby:仅正数的总和/计数

    我有一个数据框 框架 我想按国家和日期进行聚合 aggregated pd DataFrame frame groupby Country Date CaseID count aggregated Total duration frame
  • Git 子模块跟踪提交但知道分支?

    我正在一个项目中工作 我们使用 git 子模块来跟踪整个代码 一起发布的几个不同部分 所以我喜欢子模块跟踪特定提交的想法 因为子模块主要用于历史目的 这很好 这样将来人们就可以检查超级存储库的特定标签并找出每个组件的代码所在的位置 但是 如
  • 消息队列与任务队列的区别

    我想知道它们之间有什么区别 他们描述的是同一件事吗 是 Google App Engine 服务任务队列 https developers google com appengine docs java taskqueue overview是
  • 无法在 Excel for Mac 2016 中加载 macOS 连接器/MySQL ODBC 驱动程序

    我正在 High Sierra 10 13 6 上使用 Excel for Mac 版本 16 18 安装了适用于 macOS 的 Connector ODBC 8 0 12 使用 iODBC 数据源管理 64 位 测试了与我的数据库的连接
  • Xcode:添加项目作为构建依赖项

    我正在玩声音云API https github com soundcloud cocoa api wrapper tree oauth2 在其说明中说 将 SoundCloudAPI xcodeproj 拖到您的项目中 将其添加为构建依赖项
  • django(rest_framework)中的令牌身份验证不起作用

    标题基本概括了所有内容 我正在尝试使用令牌进行身份验证 我正在从 django 数据库获取信息到我的 flutter 应用程序 我已成功从rest framework 检索我的令牌并将其添加到其余请求的标头中 我在 django 中打印了这
  • ApiController 扩展方法 - 无法访问 ResponseMessage

    我想为 ApiController 创建扩展方法以便能够返回自定义内容 我的想法是用我自己的详细信息返回自定义错误 我想返回类似于返回的错误的自定义错误OAuthAuthorizationServerProvider error inval
  • ggplot:一种颜色/类别的多条线

    我正在尝试将多条线绘制为 ggplot2 中单个 类 的一部分 我可以绘制如下所示的内容 但我的问题是我想将 n1 n2 和 n3 显示为单个类 图例中每个类都有一个名称的灰色细线 我的问题是 如果我在数据框中创建一个新因素以便对它们进行分
  • 为什么哈希表扩展通常通过将大小加倍来完成?

    我对哈希表做了一些研究 并且我一直遵循经验法则 即当存在一定数量的条目 最大数量或通过负载因子 例如 75 时 应该扩展哈希表 几乎总是建议将哈希表的大小加倍 或加倍加 1 即 2n 1 然而 我一直没能找到一个很好的理由 为什么要加倍大小
  • 为列表框中的每个项目加载不同的数据模板

    我正在尝试创建一个学习应用程序 我想根据问题类型加载数据模板 如下所述 If Question Type is TYPE1 load InstructionTemplate Type1 xaml load ChoiceTemplate Ty