如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 {x:DataType}

2024-04-02

我正在写一个自定义DataTemplateSelector for a ComboBox控件,我需要用它来显示不同的DateTemplates对于不同类型的物体,在封闭和开放模式下ComboBox.

这是DataTemplateSelector我想出了:

public class ComboBoxTypedDataTemplateSelector : DataTemplateSelector
{
    public IEnumerable<DataTemplate> SelectedTemplates { get; set; }

    public IEnumerable<DataTemplate> DropDownTemplates { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        IEnumerable<DataTemplate> source = container.FindParent<ComboBoxItem>() == null
            ? SelectedTemplates // Get the template for the closed mode
            : DropDownTemplates; // Get the template for the open UI mode
        Type type = item.GetType();
        return null; // Some LINQ to get the first DataTemplate in source with the {x:DataType} that equals type
    }
}

public sealed class DataTemplatesCollection : List<DataTemplate> { }

以下是我在 XAML 中使用它的方式:

<ComboBox>
    <mvvm:ComboBoxTypedDataTemplateSelector>
        <mvvm:ComboBoxTypedDataTemplateSelector.SelectedTemplates>
            <mvvm:DataTemplatesCollection>
                <DataTemplate x:DataType="models:SomeType">
                    <TextBlock Text="{x:Bind ...}"/>
                </DataTemplate>
                <DataTemplate x:DataType="models:SomeOtherType">
                    <TextBlock Text="{x:Bind ...}"/>
                </DataTemplate>
            </mvvm:DataTemplatesCollection>
        </mvvm:ComboBoxTypedDataTemplateSelector.SelectedTemplates>
        <mvvm:ComboBoxTypedDataTemplateSelector.DropDownTemplates>
            <mvvm:DataTemplatesCollection>
                <DataTemplate x:DataType="models:SomeType">
                    <TextBlock Text="{x:Bind ...}"/>
                </DataTemplate>
                <DataTemplate x:DataType="models:SomeOtherType">
                    <TextBlock Text="{x:Bind ...}"/>
                </DataTemplate>
            </mvvm:DataTemplatesCollection>
        </mvvm:ComboBoxTypedDataTemplateSelector.DropDownTemplates>
    </mvvm:ComboBoxTypedDataTemplateSelector>
</ComboBox>

现在,我唯一缺少的部分是,我不知道如何在 C# 中获取 {x:DataType} 属性(我知道它实际上不是一个真实的属性,但我希望有一种方法可以检索它)通过代码)。 我需要类似的东西才能获得正确的结果DataTemplate对于每个对象,来自右侧模板组。 我有办法实现这一目标吗?

NOTE: 我知道我可以写一个具体的DataTemplateSelector它具有要为每个项目类型返回的模板的硬编码名称,我可以使用该方法作为后备选项。但是,我想知道是否可以用这种方法编写一个更通用的选择器,以便使其更加模块化并能够在将来重用它。

感谢您的帮助!

EDIT:按照 Vincent 的建议,我编写了一个附加属性来存储给定的Type in a DataTemplate:

public class DataTypeHelper
{
    public static Type GetAttachedDataType(DataTemplate element)
    {
        return (Type)element.GetValue(AttachedDataTypeProperty);
    }

    public static void SetAttachedDataType(DataTemplate element, Type value)
    {
        element.SetValue(AttachedDataTypeProperty, value);
    }

    public static readonly DependencyProperty AttachedDataTypeProperty =
        DependencyProperty.RegisterAttached("AttachedDataType", typeof(Type), typeof(DataTypeHelper), new PropertyMetadata(default(Type)));
}

我尝试像这样使用它:

...
 <DataTemplate x:DataType="someXlmns:SomeClass"
               mvvm:DataTypeHelper.AttachedDataType="someXlmns:SomeClass">
     ...
 </DataTemplate>

但我得到了XamlParseException在我将附加属性设置为我的类型的行处。我尝试将该属性设置为“Grid”(只是作为测试)并且它不会崩溃,我不明白为什么它不能与我的自定义类型一起使用。

EDIT #2:看起来 x:Type 标记扩展在 UWP 中不可用,并且我找不到其他方法(我认为根本不可能)直接从 XAML 获取 Type 实例,因此我只能使用该类型XAML 中的名称,然后将其与item.GetType().Name在模板选择器中。

直接从 XAML 分配 Type 属性的能力会更好,因为它还会在 XAML 设计器中进行语法/拼写检查,但至少这种方法工作得很好。


您无法检索该值。这只是编译器的一个提示,允许它为绑定生成适当的代码。

您可以创建自定义附加属性来存储您需要的内容,也可以使用“名称”属性。

<local:Selector x:Key="selector" >
    <local:Selector.Template1>
        <DataTemplate x:DataType="local:Item" x:Name="template1" >
            <.../>
        </DataTemplate>
    </local:Selector.Template1>
</local:Selector>

然后在选择器实现中

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

如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 {x:DataType} 的相关文章

随机推荐

  • AWS API Gateway 不存在“Access-Control-Allow-Origin”标头

    我遇到了 API 网关的问题 我已经浏览了 AWS 论坛上的所有其他答案 也浏览了他们的文档 但仍然没有任何乐趣 我正在尝试使用 AWS API 网关设置一个 API 该网关调用 Lambda 函数来读取 写入 DynamoDB 中的表 D
  • SSIS 中的别名参数

    我在 SSIS 中使用 OLE DB 命令 其 SQL 命令如下所示 UPDATE DBO CLIENT SET TimeZoneID DaylightSavingTime ModifiedBy MicrosPropertyID IsOff
  • Haskell 函子隐含定律

    类型分类百科全书 http www haskell org haskellwiki Typeclassopedia says 类似的论点还表明 任何满足第一定律 fmap id id 的 Functor 实例也将自动满足第二定律 实际上 这
  • 检测 Asp.net 上的浏览​​器关闭

    我想在注销时执行一些功能 如果用户直接关闭浏览器 则需要执行相同的功能 我们无法在页面卸载上执行此操作 因为我的网站中有 100 多个页面 因为这将在每个页面的重定向上起作用页 谢谢
  • 操作员 '??'不能应用于“System.DateTime”类型的操作数

    我收到以下错误 Operator cannot be applied to operands of type System DateTime foreach EndServReward r in reward if con State Co
  • R TwitteR 包授权错误

    我正在关注最新更新推特主页 https github com geoffjentry twitteR 我无法通过授权流程 library devtools install github twitteR username geoffjentr
  • php 中 eregi() 的替代方案 [重复]

    这个问题在这里已经有答案了 因此 我在邮件脚本中使用了 eregi 但最近 我收到该函数已弃用的错误 那么 替换以下代码的最简单方法是什么 if eregi A Z0 9 A Z0 9 A Z 2 4 trim POST email 任何帮
  • Pandas:如何创建年周变量?

    我有一个带有日期时间的数据框 dates pd date range 9 25 2010 periods 10 freq D df pd DataFrame col dates df col pd to datetime df col df
  • 连接无序线段

    我的算法生成一个 通常 数千条线段 全是二维 的列表 我需要将它们连接成大型折线 这些生成的折线可能是闭合的或开放的 但它们永远不会自相交 线段没有方向 即可能需要翻转线段才能将其连接到相邻线段 找到这些折线的极快方法是什么 我必须实时执行
  • 什么是可以轻松集成到现有应用程序的优秀 Ruby on Rails 论坛?

    什么是可以轻松集成到现有应用程序的优秀开源 RoR 3 论坛 可选功能 OpenID 支持 Haml SCSS 模板 支持表情符号 YouTube 图像等 我可能会对其进行很多更改 而且我对 Ruby 的了解仍然很弱 因此干净的 带注释的代
  • 如何反转 sed 输出?

    我正在阅读大约 500 个字符的行 我怎样才能让 sed 不用某些东西替换该字符串 而是用某些东西替换该行的其余部分 简而言之 我想删除指定字符串周围的所有文本 使用 awk 删除列不起作用 因为匹配的字符串前后有不确定数量的字符 有任何想
  • 如何将 JFreechart 添加到面板?

    我尝试寻找答案来使其正常工作 但没有成功 我快要失去理智了 所以这是我的问题 我最近下载了 JFreeChart 来创建图表并在我的 GUI 中实现它们 这是我想要插入图形的 GUI 和面板 以白色标记 报告1 http www freei
  • Fiddler 测试 API Post 传递 [Frombody] 类

    我有一个非常简单的 C APIController 名为 TestController 其 API 方法如下 HttpPost public string HelloWorld FromBody Testing t return t Nam
  • 组合框架更新 UI 无法正常工作

    我想尝试Combine框架 使用非常简单 按aUIButton 并更新UILabel 我的想法是 添加发布者 Published var cacheText String 订阅 cacheText assign to text on cac
  • 无法在类似字节的对象上使用字符串模式 - python 的重新错误[重复]

    这个问题在这里已经有答案了 我正在做 python 挑战并试图熟悉 python 所以在不看答案的情况下 我尝试使用 python 的 url 阅读器来读取 html 然后找到所需的字母 但是在下面的代码中我收到一个错误 最初是 pytho
  • 为 Windows 服务创建 MSI 安装程序

    我在 Visual Studio 2008 中有一个 Windows 服务项目 我还添加了安装和部署项目 不幸的是 当我安装它时 该服务没有显示在服务 MMC 管理单元中 我已经将 ProjectInstaller 添加到服务项目中 并且已
  • 使用APNS发送远程推送通知的送达报告 - IOS

    我正在使用 APNS 发送远程推送通知 要求是当通知发送给应用程序用户时 即使用户没有点击通知甚至没有看到通知 根据通知 id i 将发送收据发送到 Web 服务器 即调用 Web 服务 已收到 APNS 没有提供交付报告 他们是 APNS
  • 当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践

    关于在数据库中保存日期时间和时区信息有很多问题 但更多的是总体水平 这里我想讲一个具体的案例 系统规格 我们有一个订单系统数据库 它是一个多租户系统 租户可以使用任意时区 它是任意的 但每个租户只有一个时区 保存在租户表中一次并且永不更改
  • 为什么 int[] a = new int[1] 而不是 int a ?

    这段代码中是否有一些我在 java 中看不到的隐藏含义 怎么可能有用呢 int a new int 1 不仅仅是 int a 因为从我的角度来看这是一样的 int a 定义一个原始 int int a new int 1 定义一个有空间容纳
  • 如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 {x:DataType}

    我正在写一个自定义DataTemplateSelector for a ComboBox控件 我需要用它来显示不同的DateTemplates对于不同类型的物体 在封闭和开放模式下ComboBox 这是DataTemplateSelecto