public class WalterlvExtension : MarkupExtension
private object _value;
public object Value
get => _value;
set => _value = value;
public override object ProvideValue(IServiceProvider serviceProvider)
return Value;
}
// 注意:这一段代码实际上是无效的。
public static readonly DependencyProperty ValueProperty = DependencyProperty.RegisterAttached(
"Value", typeof(object), typeof(WalterlvExtension), new PropertyMetadata(default(object)));
public object Value
get => ???.GetValue(ValueProperty);
set => ???.SetValue(ValueProperty, value);
}
// 注意:这一段代码实际上是无效的。
public static readonly DependencyProperty ValueProperty = DependencyProperty.RegisterAttached(
"Value", typeof(object), typeof(WalterlvExtension), new PropertyMetadata(default(object)));
public object Value
get => _dependencyObject.GetValue(ValueProperty);
set => _dependencyObject.SetValue(ValueProperty, value);
private readonly DependencyObject _dependencyObject = new DependencyObject();
现在虽然可以编译通过,但是我们会遇到两个问题:
ValueProperty
的变更通知的回调函数中,我们只能找到
_dependencyObject
的实例,而无法找到外面的类型
WalterlvExtension
的实例;这几乎使得
Value
的变更通知完全失效。
在
Value
的
set
方法中得到的
value
值是一个
Binding
对象,而不是正常依赖属性中得到的绑定的结果;这意味着我们无法直接使用
Value
的值。
public class WalterlvExtension : MarkupExtension
public WalterlvExtension()
_valueExchanger = new ClrBindingExchanger(this, ValueProperty, OnValueChanged);
private readonly ClrBindingExchanger _valueExchanger;
public static readonly DependencyProperty ValueProperty = DependencyProperty.RegisterAttached(
"Value", typeof(object), typeof(WalterlvExtension),
new PropertyMetadata(null, ClrBindingExchanger.ValueChangeCallback));
public object Value
get => _valueExchanger.GetValue();
set => _valueExchanger.SetValue(value);
private void OnValueChanged(object oldValue, object newValue)
// 在这里可以处理 Value 属性值改变的变更通知。
public override object ProvideValue(IServiceProvider serviceProvider)
return Value;