WPF - 引用多个资源

时间:2011-10-03 06:54:30

标签: xaml collections

专家,

在XAML中,我想在实体之间创建多对多关系。

基本上我希望多个“Manager”对象能够管理多个“Items”。以下XAML应描述我正在寻找的内容:

<Grid>
    <Grid.Resources>
        <cc:Manager x:Key="Manager1"/>
        <cc:Manager x:Key="Manager2"/>
    </Grid.Resources>
    <cc:Item>
        <cc.Manager.ManagedBy>
            <StaticResource ResourceKey="Manager1" />
        </cc.Manager.ManagedBy>
    </cc:Item>
    <cc:Item>
        <cc.Manager.ManagedBy>
            <StaticResource ResourceKey="Manager1" />
            <StaticResource ResourceKey="Manager2" /> <!-- ERROR HERE -->
        </cc.Manager.ManagedBy>
    </cc:Item>
    <cc:Item>
        <cc.Manager.ManagedBy>
            <StaticResource ResourceKey="Manager2" />
        </cc.Manager.ManagedBy>
    </cc:Item>
</Grid>

附加属性(Manager.ManagedBy)的类型为ManagedByCollection ...

ManagedByCollection : List<ManageBy>

有了这个,我收到以下错误信息:

The object 'Object' already has a child and cannot add 'StaticResourceExtension'. 'Object' can accept only one child. Line NN Position NN.

所以,我没有回到MSDN并意识到有一个ContentPropertyAttribute告诉XAML编译器什么属性是默认属性,当没有指定任何其他属性时。例如,LinearGradientBrush使用该属性使我们只能写...

<LinearGradientBrush ... >
   <GradientStop ... />
   <GradientStop ... />
   <GradientStop ... />
</LinearGradientBrush>

......而不是......

<LinearGradientBrush ... >
   <GradientStopCollection>
       <GradientStop ... />
       <GradientStop ... />
       <GradientStop ... />
   </GradientStopCollection>
</LinearGradientBrush>

所以,我认为我只需要将ManagedByCollection的索引器指定为类'ContentProperty:

[ContentProperty("Item")
ManagerCollection : List<Manager>

不幸的是,这并不能解决问题。目前以下工作......

<cc.Manager.ManagedBy>
    <ManagerCollection>
        <StaticResource ResourceKey="Manager1" />
        <StaticResource ResourceKey="Manager2" />
    <cc:ManagerCollection>
</cc.Manager.ManagedBy>

...但是,我更喜欢更易读的语法:

<cc.Manager.ManagedBy>
    <StaticResource ResourceKey="Manager1" />
    <StaticResource ResourceKey="Manager2" />
</cc.Manager.ManagedBy>

任何帮助或提示都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以在Item

的构造函数中显式初始化集合
public Item()
{
    Manager.SetManagedBy(this, new ManagedByCollection());
}