首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DependencyObject.InvalidateProperty不工作

DependencyObject.InvalidateProperty不工作
EN

Stack Overflow用户
提问于 2011-02-07 21:21:55
回答 3查看 5.7K关注 0票数 13

基于MSDN的文档 .

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

下面的...the代码应该可以工作,但它不能工作。

代码语言:javascript
复制
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>

知道是什么导致了这种行为吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-23 03:33:35

正如你所提到的,它应该起作用,但不起作用。但有一个简单的解决办法:

代码语言:javascript
复制
// Doesn't work:
//b.InvalidateProperty(Button.ContentProperty);

// Works:
BindingOperations.GetBindingExpression(b, Button.ContentProperty).UpdateTarget();

我在引用源中进行了调试,在您的情况下,InvalidateProperty所做的一切都是将缓存的值从BindingExpression重新读取到Button Content属性中。无意中,我不知道这在什么时候是必要的,但是让BindingExpression重新读取原始属性是没有用的。

由于解决方法方便且通用,因此唯一需要做的进一步工作就是向Microsoft提交一份bug报告。

票数 14
EN

Stack Overflow用户

发布于 2011-02-08 08:42:34

是。我有个主意。

代码不能工作的原因是该按钮请求新值,但是绑定对象保存旧的值,因为它没有收到PropertyChanged通知。standart场景中的更改链如下所示:

Payload.Timestamp ->绑定对象-> Button.ContentProperty

在您的场景中,当您调用InvalidateProperty链时是:

绑定对象-> Button.ContentProperty

因此,您应该通知binding对象,它的源已经用下一段代码更改了:

代码语言:javascript
复制
    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刷新内容。

票数 3
EN

Stack Overflow用户

发布于 2011-02-22 20:18:35

我们也没有让它起作用,这是一个函数,它的作用是:

代码语言:javascript
复制
private void InvalidateProperty(DependencyProperty property,
    FrameworkElement container)
{
    container.SetBinding(property, 
        container.GetBindingExpression(property).ParentBinding);
}

我们这样称呼它:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4926748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档