附加财产不起作用,除非我在其名称的末尾加上“财产”

时间:2014-06-16 17:59:50

标签: c# wpf attached-properties

我有一个简单的附加属性:

class TestAttached
{
    public static readonly DependencyProperty TestProperty = DependencyProperty.RegisterAttached("TestProperty", typeof(string), typeof(TestAttached));

    public static string GetTest(DependencyObject d)
    {
        return (string)d.GetValue(TestProperty);
    }

    public static void SetTest(DependencyObject d, string value)
    {
        d.SetValue(TestProperty, value);
        TextBox tb = d as TextBox;
        tb.Text = value;
    }
}

<TextBox local:TestAttached.Test="Test" />

除非我将SetTest的第一个参数设置为&#34; TestProperty&#34;否则没有任何事情发生并且没有命中断点(我放在RegisterAttached)。而不是&#34;测试&#34;。我找到的没有教程,包括one on MSDN,这样做,据我所知,我的代码与他们的代码相同,应该可行。是什么给了什么?

1 个答案:

答案 0 :(得分:5)

当通过XAML获取/设置Dependency属性时,永远不会调用包装器方法。所以,你应该避免在那里编写代码。

来自MSDN

  

属性的 XAML处理器行为的当前WPF实现   设置完全绕过包装,你不应该放任何   为你的包装器设置定义的附加逻辑   自定义依赖属性。如果你把这样的逻辑放在集合中   定义,然后在属性时不执行逻辑   在XAML而不是代码中设置。

相反,您可以使用 PropertyChangedCallback ,以防您想要在DP的属性更改中添加一些代码。

public static readonly DependencyProperty TestProperty =
    DependencyProperty.RegisterAttached("Test", typeof(string),
                                         typeof(TestAttached),
                                         new PropertyMetadata(TestChanged));

public static void TestChanged(DependencyObject d,
                               DependencyPropertyChangedEventArgs e)
{
    // Place your code here
}

<强>更新

  

但如果我将名称更改为&#34; TestProperty&#34;然后断点得到   击中了SetTest。

原因是: Test 现在表现为正常CLR属性。当你将其破解为IL代码时,属性只不过是Get / Set方法。

这就是为什么setter会像正常的CLR属性一样被击中的原因。

如果您尝试与其他属性绑定,

<TextBox local:TestAttached.Test="{Binding SomeCLRProperty}" />

你会看到应用程序崩溃说明:

  

A&#39;绑定&#39;不能在“SetTest”上设置&#39;类型&#39; TextBox&#39;的属性。   A&#39;绑定&#39;只能在a的DependencyProperty上设置   的DependencyObject。