WPF - ссылка на несколько ресурсов - PullRequest
0 голосов
/ 03 октября 2011

Эксперты,

В 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>

Любая помощь или подсказки будут оценены.

1 Ответ

1 голос
/ 03 октября 2011

Вы можете явно инициализировать коллекцию в конструкторе Item:

public Item()
{
    Manager.SetManagedBy(this, new ManagedByCollection());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...