依赖属性强制绑定问题

Posted

技术标签:

【中文标题】依赖属性强制绑定问题【英文标题】:Dependency Property Coercion binding issues 【发布时间】:2011-03-01 12:28:12 【问题描述】:

我同时安装了 VS2008 和 VS2010,我看到一个非常奇怪的行为

在 VS2008 中,我有一个简单的 WPF 应用程序:

<TextBox x:Name="textbox" Text="Binding Path=MyProperty,Mode=TwoWay"></TextBox>

public Window1()

    InitializeComponent();
    DataContext = this;

public string MyProperty

    get  return (string)GetValue(MyPropertyProperty); 
    set  SetValue(MyPropertyProperty, value); 

public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(string), typeof(Window1), new PropertyMetadata("default",null,Coerce));

private static object Coerce(DependencyObject d, object baseValue)

    return "Coerced Value";

当我在文本框中输入随机字符串并点击选项卡时,我希望 textbox.Text 被重置为“强制值”。如果我调试,我会看到应用在强制功能中中断,但 UI 没有更新。

有趣的是,同样的代码在 VS2010 中也可以使用,UI 会使用强制值进行更新。 有人知道发生了什么吗?

这是一个 WPF 错误吗?还是我错过了什么?

【问题讨论】:

【参考方案1】:

您必须通过UpdateTarget() 强制更新。看看http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c404360c-8e31-4a85-9762-0324ed8812ef/

【讨论】:

那行得通,但是如果强制只能发生在按钮单击或其他东西上,那有什么意义......我不妨手动更新值。有趣的是VS2010/.net4.0可以自动做到。所以看起来 .net3.5SP1 没有完全烘焙强制转换。 我猜有太多人抱怨 Coerce 没有按预期工作。 我现在已经多次找到该解决方案的提示,但没有一个解释 where 以插入对UpdateTarget() 的调用。在CoerceValueCallback?这当然为时过早,因为到那时价值还没有被强制。那么 - 什么时候应该调用UpdateTarget()? (我在related question 中进行了更广泛的阐述。)

以上是关于依赖属性强制绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF非依赖属性绑定的问题

强制重新评估依赖属性以强制值

2019-11-29-WPF-依赖属性绑定不上调试方法

XAML 绑定不适用于依赖属性?

绑定“IsReadOnly”依赖属性

UI绑定依赖属性的异步处理