【问题标题】:How can you be notified of DynamicResource changes (relative to a particular FrameworkElement) without having a DependencyProperty to set it on?如何在没有 DependencyProperty 设置的情况下通知 DynamicResource 更改(相对于特定 FrameworkElement)?
【发布时间】:2015-11-19 07:46:48
【问题描述】:

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

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

我考虑创建一个虚假的绑定源对象,然后我可以绑定到该对象,但问题是它不是可视化树的一部分,因此除非在应用程序级别定义该资源,否则您将无法获得它。你也不能把东西塞进视觉树。

我看到了一个使用 Behaviors 的答案,它可以定义一个 DependencyProperty,当附加到 FrameworkElement 时,它们确实会像人们怀疑的那样更新,但这需要 XAML,因为我不知道如何调用 Behaviors-equivalent FrameworkElement 的 setResourceReference。

所以...想法?

【问题讨论】:

  • 你为什么需要这样的东西?你确定资源是要走的路吗?
  • 大声笑...我喜欢人们评论用法而不是问题。是的,它必须是一种资源。我过度简化它以获得我需要的核心信息,它能够绑定到动态资源并通过转换器提供它。我实际上找到了一个 DynamicResourceExtension 形式的解决方案,其中在 ProvideValue 中我从 ProvideValue() 获取基值,将其设置为自定义行为上的 Dp 类型对象的值,将行为添加到目标框架元素的行为,然后也将它用作我设置转换器并返回的绑定源。

标签: c# wpf binding behavior dynamicresource


【解决方案1】:

没有用法很难给出令人满意的答案。 Behavior 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,您可以绑定、获取通知并将值传递给转换器。

【讨论】:

  • 不完全。毕竟,您将该属性绑定到使用转换器的位置是什么?您需要另一个对象作为具有自己的依赖属性的目标,使用这个作为源。另外,您必须为每种此类用途创建不同的附加属性。 (即,您不能以这种方式在同一个对象上拥有两个动态资源绑定。)虽然我的 Behavior 解决方案在内部新建了此类对象,但所有这些对使用它的用户来说都是隐藏的,就像常规绑定一样。一旦解决了更多问题,我将发布我的解决方案。
  • 我没有,但我同意这不是一个好问题,请在代码表单中发布用法,当你想做什么并且问题可以为其他用户服务时,我会点赞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2019-10-31
相关资源
最近更新 更多