如何将逻辑添加到现有依赖项属性回调?

时间:2009-08-21 04:30:55

标签: c# .net exception dependency-properties invalidoperationexception

我正在尝试将一个PropertyChangedCallback添加到UIElement.RenderTransformOriginProperty。当我尝试覆盖PropertyMetadata时抛出异常。

我搜索了MSDN和Google,而我能够提出的只有this。在该帖子的某些时候建议使用DependencyPropertyDescriptor.AddValueChanged,但这不会解决我的问题,因为这不是每个实例的回调。

我不明白这个例外意味着什么。有谁知道我做错了什么?

public class foo : FrameworkElement
{
    private static void Origin_Changed( DependencyObject d,
                                        DependencyPropertyChangedEventArgs e)
    { }

    static foo()
    {
        PropertyMetadata OriginalMetaData =
            UIElement.RenderTransformOriginProperty.GetMetadata(
                typeof(FrameworkElement));



/*An exception is thrown when this line is executed:
 "Cannot change property metadata after it has been associated with a property"*/
        OriginalMetaData.PropertyChangedCallback +=
            new PropertyChangedCallback(Origin_Changed);



        UIElement.RenderTransformOriginProperty.OverrideMetadata(
            typeof(foo), OriginalMetaData);
    }
}

1 个答案:

答案 0 :(得分:21)

当您调用OverrideMetadata时,WPF将为您合并属性元数据,无需将原始元数据对象传递给它。所以你要做的就是

UIElement.RenderTransformOriginProperty.OverrideMetadata(typeof(foo), new PropertyMetadata(new PropertyChangedCallback(Origin_Changed)));

有一点需要注意的是,上面的代码有时会引发异常。发生这种情况的两种情况是

1。原始元数据是PropertyMetadata的子类 - 我见过FrameworkPropertyMetadata和UIPropertyMetadata。你必须在每种情况下使用适当的一个。

2. 依赖项属性是只读属性,您无法对其执行任何操作。