专家,
在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>
任何帮助或提示都将不胜感激。
答案 0 :(得分:1)
您可以在Item
:
public Item()
{
Manager.SetManagedBy(this, new ManagedByCollection());
}