如何在没有DependencyProperty设置的情况下通知DynamicResource更改(相对于特定的FrameworkElement)?

时间:2015-11-19 07:46:49

标签: c# wpf binding behavior dynamicresource

有一个奇怪的请求。我需要在动态资源相对于FrameworkElement更改时收到通知,但我没有在上设置属性该FrameworkElement。因此,我无法在XAML中使用{DynamicResource someKey},也无法在代码隐藏中使用someElement.SetResourceReference()

现在获取当前值很容易。你只需要调用someElement.FindResource("someKey")即可获得当前值,但这需要轮询。

我考虑创建一个我可以绑定到的人造绑定源对象,但问题是它不是可视化树的一部分,所以除非在应用程序级别定义了该资源,否则你赢得了#39;得到它。你也不能把东西塞进可视树中。

我已经看到使用可以定义DependencyProperty的行为的答案,当附加到FrameworkElement时,它们确实会更新,因为我不知道如何调用XAML行为 - 相当于FrameworkElement的setResourceReference。

所以...想法?

1 个答案:

答案 0 :(得分:0)

如果没有使用,很难给出令人满意的答案。行为A.K.A附加属性解决方案将起作用,但它使用DependencyProperty

public static class AttachedProperty
{
    public static readonly DependencyProperty DynamicResourceProperty = DependencyProperty.RegisterAttached("DynamicResource", typeof(object), typeof(AttachedProperty), new PropertyMetadata(null));

    public static object GetDynamicResource(DependencyObject obj)
    {
        return (object)obj.GetValue(DynamicResourceProperty);
    }

    public static void SetDynamicResource(DependencyObject obj, object value)
    {
        obj.SetValue(DynamicResourceProperty, value);
    }
}

您可以在要跟踪资源的元素上设置附加属性。

<Grid x:Name="grid" my:AttachedProperty.DynamicResource="{DynamicResource Brush}"/>

这是你可以绑定的DependecyProperty,获取通知并将值传递给转换器。