Эксперты,
В 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>
С этим Iполучить следующее сообщение об ошибке:
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>
Любая помощь или подсказки будут оценены.