全球范围附属依赖属性

时间:2013-12-13 14:58:58

标签: c# wpf mvvm dependency-properties

我想在正常编程中执行类似静态变量的操作,仅在使用依赖项属性的XAML中执行。

意思是我希望该属性:

  • 是一个实例
  • 每个元素都可见
  • 可绑定

我该怎么做?

2 个答案:

答案 0 :(得分:4)

听起来你想要一个始终适用于每个元素的附加属性。我认为最简单的方法是通过依赖属性的CoerceValueCallback,你可以强制它总是返回静态值而不管元素的本地值(你会更新{的静态值) {3}})。

但这似乎是一种使用依赖属性系统的奇怪方法。也许你只需要一个中央绑定源?您可以使用Binding.Source

分配x:Static来绑定到静态实例
{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; }
}

答案 1 :(得分:2)

易。

在DependencyObject类型上创建attached 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 值。

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

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

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