我有一个简单的附加属性:
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,这样做,据我所知,我的代码与他们的代码相同,应该可行。是什么给了什么?
答案 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。