从没有密钥的代码创建XAML资源

时间:2020-03-06 14:47:51  来源:igfitidea点击:

有没有一种方法可以通过代码将资源添加到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无效。

解决方案

使用我们希望模板应用于的类型作为键:

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

与上面的模板一样,我们提供一种类型。我们必须提供名称或者类型。

使用我们希望模板应用于的类型作为键:

HierarchicalDataTemplate fieldPropertyTemplate = new 
    HierarchicalDataTemplate("FieldProperyInfo");

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

代码无法正常工作的原因是我们实际上没有设置绑定。我们需要使用要绑定绑定到的属性来调用SetBinding。