Linq DataContext刷新和属性更改&;属性更改事件

Linq DataContext刷新和属性更改&;属性更改事件,linq,linq-to-sql,datacontext,inotifypropertychanged,Linq,Linq To Sql,Datacontext,Inotifypropertychanged,我所处的情况是,外部消息来源通知我,某个特定实体已在我当前的datacontext之外更改。我能够找到实体并像这样调用refresh MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues,myEntity) 并正确更新实体上已更改的属性。但是,刷新时,两个INotifyPropertyChanging INotifyPropertyChanged都不会出现,这会使我的UI显示不正确的信息 我知道Refresh()无法在实体上使用正确的属

我所处的情况是,外部消息来源通知我,某个特定实体已在我当前的datacontext之外更改。我能够找到实体并像这样调用refresh

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues,myEntity)

并正确更新实体上已更改的属性。但是,刷新时,两个INotifyPropertyChanging INotifyPropertyChanged都不会出现,这会使我的UI显示不正确的信息

我知道Refresh()无法在实体上使用正确的属性getter和setter来引发更改通知事件,但也许还有其他方法可以完成同样的事情

我做错什么了吗? 有比刷新更好的方法吗?
如果刷新是唯一的选项,有人有解决办法吗?

如果您知道调用Refresh(),为什么不直接在此时刷新UI呢

PropertyChanged和PropertyChanged是通过调用LINQtoSQL DBML生成的实体类上的setter来调用的。调用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();
        }
    }
}

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

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh();
这似乎迫使我的树视图更新所有内容。唯一的缺点(这是一个非常重要的缺点)是它似乎会折叠所有树节点,这会导致用户失去位置。我也可以将我的
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元素都会收到消息,并相应地进行更新。这甚至适用于treeview控件和类似于刷新绑定时不希望UI出现“重置”的情况。

Rex,refresh()是在控制器/“几乎是业务层”级别完成的,它离UI很远,因此手动刷新是不可能的。如果Refresh()更改了enity数据,它应该会引发已更改的事件,但事实上,它没有这样做对我来说似乎是一个严重的疏忽。@Scott也许这是一个疏忽,但这是我们不能更改的代码,而你的是。为什么不在DataContext类中添加一个事件,在调用Refresh()并从UI附加到该事件时调用该事件?这接近于从实体中的事件中获得的SoC。