【问题标题】:Update several data bound user controls in a WPF/WCF Application更新 WPF/WCF 应用程序中的多个数据绑定用户控件
【发布时间】:2011-08-17 12:51:07
【问题描述】:

我的大脑一直在试图解决我遇到的问题,而一些帮助将大有帮助。

我有一个从 WCF 服务下载数据结构的应用程序,数据存储在可观察的集合属性中。我有一个包含网格的用户控件,并且绑定在用户控件初始化程序上或通过x:Static 数据绑定。用户控件或 observable 集合属性可以在同一台机器上多次访问。

如果我打开了多个用户控件实例并使用网格修改了一条记录,我将更改发送到 WCF 服务,该服务修改 SQL 数据库,向修改后的对象添加一些位并将其传递回 WPF(也许将来通过回发到其他客户端应用程序)应用程序和网格更新。然而,它只在那个特定的用户控件网格上更新。

如果我强制其他用户控件网格重新绑定,则会反映数据更改,这不是我想要的。所以我决定使用 LINQ 在 observable 集合中查找要修改的对象,然后使用 IList.IndexOf 将对象添加到集合中,并删除旧对象。执行此方法似乎确实可以正常工作,但我一直在读到有更好的方法来实现这一点。

任何人都可以帮助阐明我正在尝试实现的目标,或者我已经完成通知所有绑定网格更改已正确/仅执行此操作的方式,我的所有属性都在该值上实现 inotifypropertychanged。

提前致谢

【问题讨论】:

  • 谁托管 ObservableCollection?
  • ObservabeCollection 是使用存储在 SQL 数据库中的数据从 WCF 服务生成的,该数据被发送到应用程序并作为静态属性存储在客户端计算机上的静态类中,作为本地缓存副本,网格已绑定
  • 请提供一些代码。集合是如何创建的?它是如何实现的?网格是如何与它绑定的?

标签: wpf wcf observablecollection inotifypropertychanged


【解决方案1】:

该集合由 wcf 服务创建并移交给静态类以提供对其的访问。网格绑定到这个静态类。

根据您的 cmets,我必须重写我的分析器:

您有一个网格绑定到的静态属性。如果您为此属性分配一个新集合,则网格仍会绑定到旧集合,因此它们不会更新,因为从它们的角度来看,没有任何变化。

如果您更改集合中的一项,则您更改的是该项目而不是集合。所以绑定的网格不会更新,因为从它的角度来看没有任何改变。

当您想要更新网格时,您必须在添加所有集合项时在所有集合项上注册一个 ChangedEvent-Handler。每次调用此处理程序时,因为您更改了集合中的一项,您必须触发网格进行更新。

这通常由包装集合(模型)的视图模型完成。然后网格绑定到这个视图模型,它负责通知网格(视图)任何更改。查看 MVVM 设计模式,它将为您提供解决问题的标准化方法。

【讨论】:

  • 集合只被交给静态属性一次,也就是第一次加载应用程序 MainWindow 的时候。任何时候加载辅助用户控件时,它都会绑定到静态集合。如果我直接更改可观察集合,则所有网格都绑定到同一个集合,但如果从网格修改集合中的记录,则其他网格不会更新。只有强制它重新绑定。我想我知道我哪里出错了,因为我试图像这样设置我想要修改的项目... oldObjectInObservableCollection = newObject 并希望这些更改得到反映
  • 我还注意到,如果我将静态集合属性更改为新的 observablecollection,即使集合属性实现 inotifypropertychanged 网格也不会显示新网格,除非我将其重新绑定到静态属性
  • 再一次,如果我隔离我试图使用 LINQ 查询修改的记录,我可以让它工作。使用 ILIST.IndexOf 删除记录并在新的位置放置新记录以查找它最后的位置。
  • 是的,我偶然发现了您在论坛和其他问题中推荐的内容,但很高兴从有经验的人那里得到澄清。我将不得不阅读有关如何调用事件处理程序来更新网格的更多信息(不确定添加处理程序的时间和位置),但至少我有一些方向。也与 MVVM 我已经搞砸了 ViewModelBase 结果好坏参半,但我必须继续努力,也许如何让 Changed EventHandler 与 ViewModel 对话。感谢十亿您的时间
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多