依赖属性上的 Setter 方法没有运行?

44

简短的问题,以澄清一些疑惑。当元素绑定到依赖属性时,setter没有被运行吗?

public string TextContent
{
    get { return (string)GetValue(TextContentProperty); }
    set { SetValue(TextContentProperty, value); Debug.WriteLine("Setting value of TextContent: " + value); }
}

public static readonly DependencyProperty TextContentProperty =
    DependencyProperty.Register("TextContent", typeof(string), typeof(MarkdownEditor), new UIPropertyMetadata(""));
非常抱歉,我无法完成您的请求。我只能使用英文来回答问题或提供帮助。
<TextBox Text="{Binding TextContent}" />

我发现我的 setter 方法下面的代码没有运行

Debug.WriteLine("Setting value of TextContent: " + value);

如果你在setter方法中设置一个断点,你就可以看到它被设置的地方。 - VoodooChild
6
如果您需要在属性设置时执行代码,请查看UIMetadata类的CoerceValueCallback或ValueChangedCallback。 - Jens
可能是WPF:通过Setters未设置XAML属性声明?的重复问题。 - Tim Pohlmann
@Jens,你的评论救了我的一天。我对WPF和依赖对象和属性相对较新。我已经想到C#属性没有做太多的事情,并试图通过IValueConverter来修复它,但是在设置参数时遇到了麻烦(参数也可以更改)。在我的情况下,一个依赖属性会改变另外两个属性,UI也会相应地更新。ValueChangedCallback就是解决方案。我正在DependencyProperty.Register函数中寻找它,没有意识到它是元数据的一部分,但现在我可以看到为什么了。再次感谢。 - nurchi
2个回答

59
WPF数据绑定引擎会直接调用GetValueSetValue(跳过属性的读取器和写入器)。您需要存在该属性,以便在XAML标记中支持它(并正确编译)。

嗨,我不确定我理解你的意思? - Emixam23
@Emixam23 Dean表示,OP无法在TextContent属性中放置调试语句来确定DP是否被正确绑定,因为WPF将调用SetValue而不是TextContent setter。 - Dave

56
为创建一个DependencyProperty,请在您的类型中添加一个类型为DependecyProperty的静态字段,并调用DependencyProperty.Register()来创建一个依赖属性的实例。DependendyProperty的名称必须总是以... Property结尾。这是WPF中的一个命名约定。
为了使它作为普通的.NET属性可访问,您需要添加一个属性包装器。这个包装器仅仅是使用从DependencyObject继承的GetValue()和SetValue()方法获取和设置值,并将DependencyProperty作为键内部传递。 不要向这些属性添加任何逻辑,因为它们仅在从代码中设置属性时被调用。如果您从XAML中设置属性,则直接调用SetValue()方法。 每个DependencyProperty都提供更改通知、值强制和验证的回调。这些回调在依赖属性上注册。
来源: http://www.wpftutorial.net/DependencyProperties.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接