【问题标题】:Creating a XAML Resource from Code Without a Key从没有密钥的代码创建 XAML 资源
【发布时间】:2010-09-13 13:12:24
【问题描述】:

有没有办法从代码中将资源添加到 ResourceDictionary 而不给它一个资源键?

例如,我在 XAML 中有这个资源:

<TreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type xbap:FieldPropertyInfo}"
        ItemsSource="{Binding Path=Value.Values}">
            <TextBlock Text="{Binding Path=Name}" />
    <HierarchicalDataTemplate>
</TreeView.Resources>

我需要从代码中动态创建此资源并将其添加到 TreeView ResourceDictionary。但是,在 XAML 中没有 Key 意味着它默认用于所有 FieldPropertyInfo 类型。有没有办法在没有密钥的情况下将它添加到代码中的资源中,或者有没有办法我可以使用一个密钥并仍然在所有 FieldPropertyInfo 类型上使用它?

到目前为止,这是我在 C# 中所做的:

HierarchicalDataTemplate fieldPropertyTemplate = new HierarchicalDataTemplate("FieldProperyInfo");

fieldPropertyTemplate.ItemsSource = new Binding("Value.Values");

this.Resources.Add(null, fieldPropertyTemplate);

显然,将资源添加到 ResourceDictionary 键为 null 不起作用。

【问题讨论】:

    标签: c# wpf xaml code-behind


    【解决方案1】:

    使用您希望模板应用的类型作为键:

    HierarchicalDataTemplate fieldPropertyTemplate = new 
        HierarchicalDataTemplate("FieldProperyInfo");
    
    fieldPropertyTemplate.SetBinding(
       HierarchialDataTemplate.ItemSourceProperty, 
       new Binding("Value.Values");
    this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);
    

    您的代码不起作用的原因是您的实际上没有设置绑定。您需要调用 SetBinding,并使用您希望绑定绑定到的属性。

    【讨论】:

      【解决方案2】:

      使用您希望模板应用的类型作为键:

      this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);
      

      与上面的模板一样,您提供了一个类型。您必须提供名称或类型。

      【讨论】:

      • 虽然运行,但 TreeView 并未使用模板。似乎有关 Resource 密钥的某些内容正在阻止它被使用。
      • @Orion:所以你看到了我的答案,并完全编辑了你的答案来复制我的?真的很优雅...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多