gpt4 book ai didi

linq - DataContext Refresh 和 PropertyChanging & PropertyChanged 事件

转载 作者:行者123 更新时间:2023-12-04 07:09:31 25 4
gpt4 key购买 nike

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

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myEntity);

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

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

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

最佳答案

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

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

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

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

编辑:
是的,有...


我的一个比我聪明的同事想出了这个解决方案,这似乎可以解决问题。在 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 在刷新绑定(bind)时出现“重置”的情况。

关于linq - DataContext Refresh 和 PropertyChanging & PropertyChanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/613428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com