根据 Avalonia 中的 DataContext 属性选择 DataTemplate

2023-12-12

我正在实现一个 UserControl ,它应该显示设置列表:

public class SettingPropertyItem {
    string Name { get; }
    Type ValueType { get; }
    object Value { get; set; }
}

基于每种类型ValueType应使用不同的 DataTemplate。
为了促进这一点,用户控件具有以下控件,其中包含SettingPropertyItem作为其数据上下文:

<UserControl x:Class="AVDump3Gui.Controls.Settings.SettingsView">
    ...
    <ItemsControl Items="{Binding Properties}" Margin="16,0,0,0">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
            ...
                <ContentControl Content="{Binding}"/>
            ...
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    ...
</UserControl>

然后在使用 Usercontrol 的视图中,我在其 DataTemplates 中添加了一个 DataTemplate:

<sv:SettingsView.DataTemplates>
  <DataTemplate DataType="{x:Type vm:SettingPropertyItem}">
    ...
  </DataTemplate>
</sv:SettingsView.DataTemplates>

到目前为止一切顺利,一切都按预期进行。但现在我有点困惑,因为我不知道如何基于 DataContext 中的属性应用不同的 DataTemplate。
对于 WPF,DataTemplateSelector 或触发器似乎是可行的方法(忽略其他框架),但它们在 Avalonia 中似乎不存在。我也尝试过样式,但选择器似乎无法访问 DataContext 属性。

如何才能做到这一点?


位于阿瓦罗尼亚DataTemplateSelector不需要,因为你可以实施IDataTemplate您自己并选择那里的模板。

i. e.

public class MyTemplateSelector : IDataTemplate
{
    public bool SupportsRecycling => false;
    [Content]
    public Dictionary<string, IDataTemplate> Templates {get;} = new Dictionary<string, IDataTemplate>();

    public IControl Build(object data)
    {
        return Templates[((MyModel) data).Value].Build(data);
    }

    public bool Match(object data)
    {
        return data is MyModel;
    }
}

public class MyModel
{
    public string Value { get; set; }
}
  <ItemsControl>
    <ItemsControl.Items>
      <scg:List x:TypeArguments="local:MyModel">
        <local:MyModel Value="MyKey"/>
        <local:MyModel Value="MyKey2"/>
      </scg:List>
    </ItemsControl.Items>
    <ItemsControl.DataTemplates>
      <local:MyTemplateSelector>
        <DataTemplate x:Key="MyKey">
          <TextBlock Background="Red" Text="{Binding Value}"/>
        </DataTemplate>
        <DataTemplate x:Key="MyKey2">
          <TextBlock Background="Blue" Text="{Binding Value}"/>
        </DataTemplate>
        
      </local:MyTemplateSelector>
    </ItemsControl.DataTemplates>
  </ItemsControl>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据 Avalonia 中的 DataContext 属性选择 DataTemplate 的相关文章

随机推荐

  • Gorm 关系错误:需要为关系定义有效的外键或者需要实现 Valuer/Scanner 接口

    我正在对使用 Gorm 时出现的问题进行故障排除 我的 sqlite3 数据库和 Go 数据模型一切都工作得很好 但是当我遇到一些依赖项问题时 无法在构建环境中 进入 所以我尝试从供应商文件夹中复制 删除一些包 然后重新 去 直到我让构建工
  • 连接组件

    我有一组数据 是通过将相似的子项目匹配在一起创建的 然后按 类别 对这些相似的项目进行分组 现在 结果类别必须以在每个 group id 内将相关类别分组在一起的方式进行匹配 在下面的示例中 一个匹配是 A gt B gt C gt D g
  • 使用 Windows Phone 7 解析包含数组的 JSON 对象

    好吧 我在这方面遇到了一些困难 我的 JSON 就像 names name bla name bla2 我试图做本教程但是 由于 JSON 不同 它不起作用 我必须在这个方法中放入什么 我不知道创建一个包含我的列表的 包装 类或直接使用 J
  • 仅当文件存在时追加到文件

    我已经看到了几个关于如何附加到文件 如果存在 和创建新文件 如果不存在 的答案 echo hello gt gt file txt 或覆盖文件 如果存在 如果不存在则创建一个文件 echo hello gt file txt 但我如何确保e
  • 预期语句 End If

    我在表单中设置了以下代码 但收到 预期语句 错误 我第一次这样做并认为我的语法正确 我错过了什么 使用嵌套 2 路条件时 每个条件必须由自己的条件结束End If If condition A Th
  • 在define_method中使用局部变量

    我想了解如何define method工作原理以及如何正确使用定义块之外的变量 这是我的代码 class Test def self plugin for i in 1 2 define method test i to sym do p
  • 存储过程获取想要的结果集以提高性能-MYSQL

    我对 mysql 完全陌生 正在努力编写存储过程来获取所需的结果集 正如你所看到的 下面是我的表格 我在用着节点和快车要连接的 APImysql数据库 然后我使用以下命令进行单独查询以获得所需的结果for loop 当我处理数百万条记录时
  • Salesforce对象描述有大数据,如何从Salesforce对象描述中获取有限的数据,例如选项列表值

    我正在寻找获取销售人员对象的字段和选项列表的方法 我可以使用 REAT API 调用来完成此操作 describe在对象名称之后 但有时返回的 JSON 数据非常大 其中有 95 的额外数据是我不想要的 并且带有重复的模式字符串 仅仅为了获
  • 锚标记的 onclick 事件上未定义 Javascript 函数

    我无法访问锚标记的 onclick 事件中的 javascript 函数 在某些情况下它有效 而在某些情况下则无效 任何人都可以说出为什么会发生这种情况吗 HTML 代码 a href class btn waves effect wave
  • ggplot2 饼图和圆环图在同一图上

    I am trying to replicate this with R ggplot I have exactly the same data browsers lt structure list browser structure c
  • SAS 宏,将值作为字符串传递给 where 子句

    我下面有一个 SAS 宏不起作用 此代码片段不返回任何值 因为 where 语句不起作用 有人有主意吗 我尝试添加 str 但这也不起作用 macro refreshments beverage type proc sql select w
  • WPF DataGrid 性能 - 筛选性能

    我们正处于将应用程序从 SilverLight 转换为 WPF 的阶段 我们在其中开发了 我们自己的自定义 DataGrid 位于 Silverlight 的本机 DataGrid 之上 应用程序由大量视图组成 其中 近 99 的视图都在使
  • 如何在SQL中根据多个“标签”查询数据?

    我有三个简单的表 Items ItemID int PK ItemName nvarchar50 ItemCost int Tags TagID int PK TagName nvarchar50 ItemTags ItemID int F
  • Foreach 循环(或者 do while 可能?) - 只想根据页面返回一条记录

    使用下面编辑的代码解决了这个问题 感谢所有提供帮助的人 我的数据库中有两条记录 每条记录有 6 个字段 challengeId partnerName code challengeTitle description image url 我从
  • 解析 CSV 文件并聚合值、多列

    我想修改这里的帖子 解析 CSV 文件并聚合值 对多列而不是一列求和 所以对于这些数据 CITY AMOUNT AMOUNT2 AMOUNTn London 20 21 22 Tokyo 45 46 47 London 55 56 57 N
  • 使用reduce 或join 组合数组有什么区别?

    考虑以下字符串数组 let arrayStrings H e l l o 为了组合它的元素 将 Hello 作为单个字符串 我们可以 reduce it let reducedString arrayStrings reduce 0 1 H
  • 如何在 Ajax 调用中添加 UI 旋转器?

    我想在 Ajax 调用上显示加载微调器 我试过spin js图书馆 但它不起作用 这是我的 JavaScript 函数 它使用 Ajax 调用 function sendRequest ajax url spinner type get c
  • 如果剧集直接连续或重叠,则合并日期行

    我有一个这样的表 ID BEGIN END 如果同一 ID 存在重叠剧集 例如2000 01 01 2001 12 31 and 2000 06 01 2002 06 31 我想使用合并行MIN BEGIN MAX END 如果剧集是直接连
  • 单击键盘中的“完成”按钮时如何调用方法?

    我想在 UITextField KeyBoard 中单击 完成 按钮时调用一个方法 请帮我 甚至没有必要实现委托 我非常喜欢使用良好的老式目标 操作模式来处理这个问题 如果您有多种结束编辑的方法 例如 拦截文本字段外部的触摸以取消编辑 它还
  • 根据 Avalonia 中的 DataContext 属性选择 DataTemplate

    我正在实现一个 UserControl 它应该显示设置列表 public class SettingPropertyItem string Name get Type ValueType get object Value get set 基