基于MSDN的文档 .
您还可以使用InvalidateProperty强制对无法实现推荐的INotifyPropertyChanged通知机制的数据源重新评估绑定.
下面的...the代码应该可以工作,但它不能工作。
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>知道是什么导致了这种行为吗?
发布于 2011-02-23 03:33:35
正如你所提到的,它应该起作用,但不起作用。但有一个简单的解决办法:
// Doesn't work:
//b.InvalidateProperty(Button.ContentProperty);
// Works:
BindingOperations.GetBindingExpression(b, Button.ContentProperty).UpdateTarget();我在引用源中进行了调试,在您的情况下,InvalidateProperty所做的一切都是将缓存的值从BindingExpression重新读取到Button Content属性中。无意中,我不知道这在什么时候是必要的,但是让BindingExpression重新读取原始属性是没有用的。
由于解决方法方便且通用,因此唯一需要做的进一步工作就是向Microsoft提交一份bug报告。
发布于 2011-02-08 08:42:34
是。我有个主意。
代码不能工作的原因是该按钮请求新值,但是绑定对象保存旧的值,因为它没有收到PropertyChanged通知。standart场景中的更改链如下所示:
Payload.Timestamp ->绑定对象-> Button.ContentProperty
在您的场景中,当您调用InvalidateProperty链时是:
绑定对象-> Button.ContentProperty
因此,您应该通知binding对象,它的源已经用下一段代码更改了:
private void Invalidate(object sender, RoutedEventArgs e)
{
_payload.Timestamp = DateTime.Now.Add(TimeSpan.FromHours(1)).ToLongTimeString();
Button b = sender as Button;
BindingExpression be = b.GetBindingExpression(Button.ContentProperty);
be.UpdateTarget();
}正如您所看到的,我甚至不应该调用InvalidateProperty,因为绑定机制由于基础源的更改将自动强制Button刷新内容。
发布于 2011-02-22 20:18:35
我们也没有让它起作用,这是一个函数,它的作用是:
private void InvalidateProperty(DependencyProperty property,
FrameworkElement container)
{
container.SetBinding(property,
container.GetBindingExpression(property).ParentBinding);
}我们这样称呼它:
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);
this.InvalidateProperty(Button.ContentProperty, b);
}我还必须将DataContext设置为_payload。
https://stackoverflow.com/questions/4926748
复制相似问题