如何从Generic.xaml中定义的资源字典绑定自定义控件的依赖项属性?

时间:2010-08-11 16:17:51

标签: c# wpf custom-controls binding dependency-properties

编辑:我改写了整个问题。

大家好,

我有一个带依赖项属性的自定义控件。在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时它被用来工作,但是现在我创建了一个自定义控件它不再起作用了。我不知道为什么,但如果你有兴趣,我在这里问这个问题:

Why can I no longer bind GradientStop Color to a Dependency Property of my control?

感谢所有帮助过的人,

达拉尔

4 个答案:

答案 0 :(得分:1)

ResourceDictionary中的位置与RelativeSource FindAncestor Binding的解析无关。 Source在成为Visual Tree的一部分后在运行时解析。您发布的XAML中没有任何内容可用于诊断您遇到的问题。

不相关:是什么导致您选择在另一个ResourceDictionary中声明ResourceDictionary?

答案 1 :(得分:0)

您无法数据绑定到GradientStop,请参阅How to bind GradientStop Colours or GradientStops Property in Silverlight?

答案 2 :(得分:0)

我见过Wallstreet程序员的答案。因此,我不知道最后,绑定是否有效。但是你看到绑定的问题是,你必须声明UserControl所在的命名空间,然后在绑定中使用它。

在xaml上添加名称空间声明。如果命名空间是“WindowsApplication”,那么它将如下所示:

xmlns:local="clr-namespace:WindowsApplication"

然后在绑定中写下

<GradientStop Color="{Binding Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}" Offset="0"/>  

答案 3 :(得分:0)

如果有人有兴趣,这就是我从我的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}" />

    <!-- ... -->

如果您收到此消息:

  

&#39; MyFoo&#39;成员无效,因为它没有合格的类型名称

关键是使用TemplateBinding并使用类型名称为您的属性添加前缀(就像我做的那样:&#39; local:MyControl.MyFoo&#39;)