Linq DataContext刷新和属性更改&;属性更改事件
我所处的情况是,外部消息来源通知我,某个特定实体已在我当前的datacontext之外更改。我能够找到实体并像这样调用refresh MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues,myEntity) 并正确更新实体上已更改的属性。但是,刷新时,两个INotifyPropertyChanging INotifyPropertyChanged都不会出现,这会使我的UI显示不正确的信息 我知道Refresh()无法在实体上使用正确的属性getter和setter来引发更改通知事件,但也许还有其他方法可以完成同样的事情 我做错什么了吗? 有比刷新更好的方法吗?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()无法在实体上使用正确的属
如果刷新是唯一的选项,有人有解决办法吗?如果您知道调用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。