2

我处于从外部来源获悉某个特定实体已在我当前数据上下文之外更改的情况。我能够找到实体并像这样调用刷新

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myEntity);

并且实体上已更改的属性已正确更新。但是,当刷新发生时,INotifyPropertyChanging INotifyPropertyChanged 似乎都没有出现,这使我的 UI 显示不正确的信息。

我知道 Refresh() 未能在实体上使用正确的属性获取器和设置器来引发更改通知事件,但也许还有另一种方法可以完成同样的事情?

难道我做错了什么?有没有比刷新更好的方法?如果刷新是唯一的选择,有没有人可以解决?

4

2 回答 2

3

我有一个类似的问题。我绑定到 TreeView 并且需要调用 Refresh 以响应用户取消编辑操作。该Refresh()方法乖乖地将所有原始值放回原处,但这并没有反映在我的TreeView UI中。在咨询了全能的谷歌之后,我遇到了这个解决方案:

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh();

这似乎迫使我的 TreeView 更新所有内容。唯一的缺点(这是一个非常大的缺点)是它似乎折叠了所有的树节点,这导致用户失去了他们的位置。我也可以将 my 设置ItemsSource为 null 并再次返回...效果相同,尽管如果您有一堆绑定的文本框或其他东西,这种方法会更简单,因为您不需要重新绑定每个文本框。

还有比这更好的解决方案吗?

编辑:是的,有...

我的一个比我聪明的同事想出了这个解决方案,这似乎可以解决问题。在 Linq2Sql 对象的分部类中,添加以下代码:

public void SendPropertiesChanged()
{
     foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties())
     SendPropertyChanged(prop.Name);
}

您可以在应用程序代码中调用它:

context.Refresh(RefreshMode.OverwriteCurrentValues, employee);
employee.SendPropertiesChanged();

所有 UI 元素都会收到消息,并适当地更新自己。这甚至适用于树视图控件以及您不希望 UI 在刷新绑定时出现“重置”的情况。

于 2010-04-22T13:49:51.963 回答
0

如果你知道调用 Refresh(),那为什么不直接刷新 UI 呢?

通过在 LINQtoSQL DBML 生成的实体类上调用 setter 来调用 PropertyChanging 和 PropertyChanged。调用 Refresh() 不会这样做:

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
public string DisplayName
{
    get
    {
        return this._DisplayName;
    }
    set
    {
        if ((this._DisplayName != value))
        {
            this.OnDisplayNameChanging(value);
            this.SendPropertyChanging();
            this._DisplayName = value;
            this.SendPropertyChanged("DisplayName");
            this.OnDisplayNameChanged();
        }
    }
}
于 2009-03-05T03:10:35.387 回答