2011-10-03 78 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'屬性不是有效值。' –