Как связать свойства зависимостей пользовательского элемента управления из словаря ресурсов, определенного в Generic.xaml? - PullRequest
1 голос
/ 11 августа 2010

РЕДАКТИРОВАТЬ: я перефразировал весь вопрос.

Привет всем,

У меня есть пользовательский элемент управления со свойствами зависимости. В файле Generic.xaml у меня есть словарь ресурсов. Это словарь ресурсов во внешнем словаре, определенный следующим образом:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyNamespace">

   <!-- This is the dictionary-->
   <ResourceDictionary x:Name="TheDictionaryImTalkingAbout" . . . >
   .
   .
   .
   </ResourceDictionary>
   .
   .
   .

</ResourceDictionary>

В этом словаре ресурсов, TheDictionaryImTalkingAbout, я хочу привязать свойство зависимости моего элемента управления. Я попробовал следующий XAML:

<Object x:Key="MyObject" SomeProperty="{Binding MyDependencyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyNamespace:MyControl}}}"/>

Привязка не возвращает ошибок, однако она не работает. Может кто-нибудь сказать мне, как я должен привязать к родительскому элементу управления из словаря ресурсов, который находится в Generic.xaml?

РЕДАКТИРОВАТЬ: эта привязка работает, но только для определенных свойств. Я не могу связать GradientStop Color со свойством зависимости типа color. Он ИСПОЛЬЗУЕТСЯ, чтобы работать, когда это был UserControl, но теперь он не работает, когда я создал пользовательский элемент управления. Я не знаю почему, но если вам интересно, я задал этот вопрос здесь:

Почему я больше не могу связывать GradientStop Color со свойством зависимости моего элемента управления?

Спасибо всем, кто помог,

Dalal

Ответы [ 4 ]

1 голос
/ 12 августа 2010

Расположение в ResourceDictionary не имеет ничего общего с разрешением привязки RelativeSource FindAncestor. Источник разрешается во время выполнения после того, как он становится частью визуального дерева. В опубликованном вами XAML нет ничего, что можно было бы использовать для диагностики вашей проблемы.

Не связано: Что побудило вас объявить ResourceDictionary внутри другого ResourceDictionary?

0 голосов
/ 06 марта 2015

Если кому-то интересно, вот как я привязываю свое свойство зависимостей внутри моего Generic.xaml для пользовательского элемента управления:

Часть из Generic.xaml:

    <ContentControl x:Key="MyFooDepProp" 
                Content="{TemplateBinding local:MyControl.MyFoo}">
    <!-- ... -->
    </ContentControl>

    <!-- ... -->
    <Style TargetType="ContentControl">
        <Setter Property="Content" Value="{TemplateBinding local:MyControl.MyFoo}" />

    <!-- ... -->

Если вы получите это сообщение:

Элемент 'MyFoo' недопустим, поскольку у него нет подходящего имени типа

Ключ заключается в использовании TemplateBinding и добавлении префикса к свойству с именем типа (как я сделал: 'local: MyControl.MyFoo')

0 голосов
/ 11 августа 2010

Я видел ответ от программиста Wallstreet.Поэтому я не знаю, сработает ли привязка в конце.Но проблема, которую вы видите со своей привязкой, заключается в том, что вы должны объявить пространство имен, в котором находится ваш UserControl, а затем использовать это в привязке.

Добавьте объявление пространства имен поверх вашей xaml.Если пространство имен - «WindowsApplication», то это будет выглядеть следующим образом:

xmlns:local="clr-namespace:WindowsApplication"

Затем в привязке напишите

<GradientStop Color="{Binding Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}" Offset="0"/>  
0 голосов
/ 11 августа 2010

Невозможно привязать данные к GradientStop, см. Как связать цвета GradientStop или свойство GradientStops в Silverlight?

...