Прикрепленная декларация собственности

Я создал прикрепленное свойство для добавления в UserControls. Для этого присоединенного свойства требуется привязка, а для этой привязки требуется преобразователь.

Поскольку ресурсы устанавливаются после объявления UserControl, я ищу способ объявить прикрепленное свойство после создания ресурса. Как я могу это сделать?

Например, если я определяю фон как статический ресурс, я не могу установить фон при создании элемента управления, но после создания ресурсов:

<UserControl ...
             ...
             ...>

<UserControl.Resources>
    background color declared
</UserControl.Resrouces>

<UserControl.Background>
    usage of the StaticResource here is valid.
</UserControl.Background>

Итак, я хочу сделать то же самое с прикрепленным свойством, которое я обычно определяю как:

<UserControl xx:MyAttachedProperty.Bla="{Binding A}" >

Но поскольку мне нужен конвертер, я хочу указать его после ресурсов.

Надеюсь понятно. Спасибо.


person Ignacio Soler Garcia    schedule 01.06.2013    source источник


Ответы (2)


Вы можете определить свой Converter как ресурс на одну иерархию выше либо как часть Window, либо App, а затем использовать его так, как предполагалось.

Кроме того, перенос общих ресурсов на уровень приложения дает вам преимущество re-usability, которое могут совместно использовать различные пользовательские элементы управления. Переместите конвертер в App.xaml -

<App.Resources>
  <!-- Your converter here -->
</App.Resources>
person Rohit Vats    schedule 01.06.2013
comment
Я не знал, что Ресурсы распределяются таким образом. Приятно знать. Я собираюсь проверить это. В любом случае, вы не знаете, могу ли я каким-то образом объявить прикрепленное свойство, например ‹UserControl.TheAttachedProperty›? Потому что этот преобразователь специфичен для представления и точно не будет использоваться повторно. - person Ignacio Soler Garcia; 01.06.2013
comment
@SoMoS, если вы используете только свойство UserControl, почему бы вам просто не сделать его обычным DP. Таким образом, вы также можете получить желаемое поведение, и достаточно ясно сказать, что это свойство только для этого UserControl. - person Viv; 02.06.2013
comment
Это преобразователь, который используется только в пользовательском элементе управления. Спасибо, в любом случае! - person Ignacio Soler Garcia; 02.06.2013

Вы можете использовать ResourceDictionary.

Просто добавьте его в обозреватель решений с помощью Add -> Resource dictionary

Объявите свой Converter там, как

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <BooleanToVisibilityConverter x:Key="BooleanToVisibility" />

</ResourceDictionary>

В вашем XAML вы можете использовать его как

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

Теперь вы можете использовать Converter везде, где есть Resource Dictionary.

Если вам нужен только ваш Converter в вашем UserControl (как вы упомянули в комментарии выше), вы все равно можете объявить его следующим образом:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyResources.xaml" />
            <ResourceDictionary>
                <BooleanToVisibilityConverter x:Key="MyConverter" />
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

Я просто использовал BooleanToVisibilityConverter для примера, но там легко использовать свой собственный конвертер.

person Mare Infinitus    schedule 01.06.2013
comment
Нисколько. Я не могу использовать что-либо, объявленное в этом словаре, до вызова Window.Resources, и это именно та проблема, которая у меня есть. - person Ignacio Soler Garcia; 01.06.2013
comment
Есть два шага. Объявите его в словаре, затем в window.resources добавьте этот словарь, и вы сможете его использовать. - person Mare Infinitus; 01.06.2013
comment
Словарь ресурсов — это хороший способ объявления общих ресурсов, которые можно легко повторно использовать в приложении. - person Mare Infinitus; 01.06.2013