2011-10-03 73 views
0

专家,WPF - 引用多个资源

在XAML我想创建实体之间的许多一对多的关系。

基本上我想多个“经理”对象能够管理多个“项目”。下面的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. 

所以,我wen't回到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> 

...但同样,我宁愿多readble语法:

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

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

回答

1

可以初始化集合明确的Item构造:

public Item() 
{ 
    Manager.SetManagedBy(this, new ManagedByCollection()); 
} 
+0

是的,但在这种情况下,我想弄清楚如何从藏品参考其他XAML实体,而无需显式地创建一个集合,就像使用'LinearGradientBrush'和'GradientStop'项目一样。 –

+0

@JonasRembratt,他们以同样的方式工作; LinearGradientBrush初始化其GradientStops集合,以便可以在XAML中直接添加项目 –

+0

不知道我理解。我意识到我的情况与我的情况有所不同,因为我正在使用_attached_属性,而GradientStops属于正常属性。我尝试将附加属性的默认值设置为正确的集合,但仍然出现此运行时错误: ''Spike.ManyToManyXAML.Manager'对于'ManagedBy'属性不是有效值。' –