基于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
做你的情况是会导致缓存值从重新读BindingExpression
入Button
Content
属性.另外,我不知道什么时候这甚至是必要的,但BindingExpression
重新阅读原始属性是没有用的.
由于解决方法很方便且通用,因此唯一需要进一步努力的是向Microsoft提交错误报告.