全局作用域附加的依赖项属性

本文关键字:依赖 属性 作用域 全局 | 更新日期: 2024-09-25 13:20:52

我想在正常编程中做一些类似于静态变量的事情,只在XAML中使用依赖属性。

这意味着我希望该房产:

  • 做一个例子
  • 每个元素都可见
  • 可绑定

我该怎么做?

全局作用域附加的依赖项属性

听起来您想要一个始终应用于每个元素的附加属性。我认为最简单的方法是通过依赖属性的CoerceValueCallback,在那里你可以强制它始终返回静态值,而不管元素的本地值是多少(你可以更新PropertyChangedCallback中的静态值)。

不过,这似乎是使用依赖属性系统的一种奇怪方式。也许你只需要一个中心绑定源?您可以通过使用x:Static:分配Binding.Source来绑定到静态实例

{Binding Source={x:Static Member=global:GlobalObject.SharedInstance},
         Path=SharedValue}

注意,SharedValue不是一个静态属性;它是从静态SharedInstance属性访问的实例的属性:

public class GlobalObject {
    private static readonly GlobalObject _instance = new GlobalObject();
    public static GlobalObject SharedInstance { get { return _instance; } }
    public object SharedValue { get; set; }
}

简单。

在DependencyObject类型上创建附加的DependencyProperty。

public static readonly DependencyProperty DerpProperty = 
  DependencyProperty.RegisterAttached(
  "Derp",
  typeof(DependencyObject),
  typeof(Herp),
  new FrameworkPropertyMetadata());
public static void SetDerp(DependencyObject element, Herp value)
{
    element.SetValue(DerpProperty, value);
}
public static Herp GetDerp(DependencyObject element)
{
    return (Herp)element.GetValue(DerpProperty);
}

定义在任何类型上,它也可以用于任何类型。在本例中,它在所有DependencyObject实例上创建一个名为Derp的新属性,该属性获取/设置关联的Herp

假设这是在名称空间WpfFtw中一个名为LolKThx的类型中定义的,您可以这样使用它。。。

<Textblock 
    xmlns:lol="clr-namespace:WpfFtw" 
    lol:LolKThx.Derp="There's an implicit conversion for string -> Herp, btw" />

您可以在FrameworkPropertyMetadata中指定回调,以执行设置/获取值所需的任何操作。