在ResourceDictionary内的共享WPF资源中启用数据绑定

时间:2009-05-31 15:13:48

标签: wpf data-binding resourcedictionary

我正在使用WPF中的M-V-VM模式,我有一个背景画笔,我将会经常使用它,我想把它移到一个共享的ResourceDictionary中。

唯一的问题是画笔使用通过数据绑定获得的颜色到其托管上下文。

无论如何我可以将画笔移到ResourceDictionary中并仍然找到它需要的值吗?

刷子:

<RadialGradientBrush>
    <RadialGradientBrush.RelativeTransform>
        <TransformGroup>
            <ScaleTransform CenterX="0.5"
                            CenterY="0.5"
                            ScaleX="2.3"
                            ScaleY="2.3" />
            <TranslateTransform X="-0.3"
                                Y="-0.3" />
        </TransformGroup>
    </RadialGradientBrush.RelativeTransform>
    <GradientStop Color="{Binding Path=BackdropColor}"
                  Offset="1.2" />
    <GradientStop Color="#FFFFFFFF"
                  Offset="-0.1" />
</RadialGradientBrush>

在将其重新分解为ResourceDictionary并添加密钥后,我将其称为:

<StackPanel Grid.Row="0"
            Margin="0,0,0,0"
            Orientation="Horizontal"
            Background="{DynamicResource BackdropRadGradBrush}">

但是这导致了调试器中的输出:

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= BackdropColor;的DataItem = NULL; target元素是'GradientStop'(HashCode = 16001149); target属性为'Color'(类型'Color')

2 个答案:

答案 0 :(得分:3)

我认为您不能将此Brush保留在资源字典中并使用绑定来提取颜色。由于刷子只创建一次(这就是你首先想要它在资源字典中的原因),因此在创建时WPF不知道它将在何处使用,因此它不能为颜色。

例如,如果颜色保存在Setings中,那可能会起作用 - 但我猜这对你没用,因为你可能希望颜色在每个使用它的控件上改变(否则,你可以硬编码颜色,或者它已经在设置中。)

也许你可以创建一个RadialGradientBrush子类,并将第一个GradientStop颜色公开为DependencyProperty?然后,您可以在需要的地方创建此子类的实例,并使用绑定在那里提取正确的颜色。

答案 1 :(得分:0)

这有点晚了,但请看一下使用StaticResourceDynamicResource而不是Binding - 它会允许您访问另一个资源。不完全Binding,但它总比没有好。