DependencyObject.InvalidateProperty无法正常工作

Aar*_*ver 13 c# wpf binding

基于MSDN 的文档 ......

您还可以使用InvalidateProperty强制重新评估针对无法实现建议的INotifyPropertyChanged通知机制的数据源的绑定...

......下面的代码应该可行,但事实并非如此.

public partial class Window1 : Window
{
    private Payload _payload = new Payload();

    public Window1()
    {
        InitializeComponent();

        this.DataContext = _payload;
    }

    private void Invalidate(object sender, RoutedEventArgs e)
    {
        _payload.Timestamp = DateTime.Now.Add(TimeSpan.FromHours(1)).ToLongTimeString();

        Button b = sender as Button;
        b.InvalidateProperty(Button.ContentProperty);
    }
}

public class Payload
{
    private String _payload = DateTime.Now.ToLongTimeString();
    public String Timestamp 
    {
        get
        {
            return _payload;
        }
        set
        {
            _payload = value;
        }
   }
}

<Grid>
    <Button Click="Invalidate"
            Width="100" 
            Height="50" 
            Content="{Binding Path=Timestamp}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

知道造成这种行为的原因是什么吗?

Ric*_*key 14

如你所说,它应该工作,但不是.但有一个简单的解决方法:

// Doesn't work:
//b.InvalidateProperty(Button.ContentProperty);

// Works:
BindingOperations.GetBindingExpression(b, Button.ContentProperty).UpdateTarget();
Run Code Online (Sandbox Code Playgroud)

我调试到参考源和所有InvalidateProperty做你的情况是会导致缓存值从重新读BindingExpressionButton Content属性.另外,我不知道什么时候这甚至是必要的,但BindingExpression重新阅读原始属性是没有用的.

由于解决方法很方便且通用,因此唯一需要进一步努力的是向Microsoft提交错误报告.