【问题标题】:ObservableCollection and List presentation in WPFWPF 中的 ObservableCollection 和 List 表示
【发布时间】:2015-08-13 18:37:39
【问题描述】:

我的解决方案包含两个项目。第一个项目连接到外部服务器并使用数据更新自己的结构。

在这个项目中,我有以下两个类:

class Quote
{... class fields}

class Quotes:IEnumerable<Quote>
{ List<Quote> list = new List<Quote>(); }

class Main
{
Quotes quotelist = new Quotes;
}

第二个项目是简单的 UI,旨在使用 WPF 在屏幕上呈现来自第一个项目的数据。

为此我创建了一个ObservableCollection

ObservableCollection<Quote> quotes =  new ObservableCollection<Quote>(quotelist);

然后,我将 XAML 中的引号绑定到网格。

这不起作用意味着对列表的更改不会更新。我想我可能会尝试在第一个项目中将List 替换为ObservableCollection,但如果可能的话,我宁愿不这样做。

最好的做法是什么。在我看到的所有示例中,列表 (ObservableCollection) 是在 ViewModel 级别上创建的。就我而言,列表是在较低级别创建和更新的。 如何让引号(ObservableCollection)知道引号列表(列表)的变化?我希望我的描述有意义。

【问题讨论】:

  • 1.当您将列表传递给 ObservableCollection 构造函数时,它只是将项目从集合复制到 ObservableCollection。对原始列表的任何更改都不会反映在 ObservableCollection 中。 2. ObservableCollection 定义在 System.ObjectModel.dll 中,并不特定于 WPF 或任何其他框架。您可以在 poco 类、业务逻辑或数据访问组件中使用它。
  • 也许你不需要在业务数据发生变化时通知 ui,因为它们只有在用户执行某些操作时才会发生变化,例如调用命令。然后您可以在更改业务组件后在命令处理程序中刷新您的 ui
  • 这是不正确的。大多数更改是由于与外部服务器通信而执行的。如果有的话,用户输入是最少的。
  • 好的,但是谁触发了通信?我的意思是这样的:`await quotesRepository.LoadData(); OnPropertyChanged("报价");
  • 我决定在项目一中使用 ObservableCollection 代替 List。它有效,但偶尔会引发异常。我希望我使用 C# 论坛上解释的所谓调度程序解决了它。我不明白它的想法,但它似乎到目前为止工作。回答您的问题:沟通是双向的。我的程序设置异步通信端口并监听它。如果需要向服务器发送任何内容,我的程序还可以通过同步通信端口触发通信。

标签: wpf list data-binding observablecollection


【解决方案1】:

然后您必须以某种方式允许第一个项目通知第二个项目,列表中的某些内容已更改并且需要更新/刷新 ObservableCollection。 我会建议以下三种方式之一:

  • 在第一个项目中创建一个事件,并让第二个项目使用更新可观察集合的事件处理程序订阅该事件
  • 在第一个项目中创建一个委托属性,并在第二个项目中附加一个方法/lambda,这将更新可观察集合
  • 让你的Quotes类实现INotifyCollectionChanged接口并直接绑定到它

【讨论】:

  • 我不确定是否只让第二个项目知道项目一中列表的更改就足够了。项目二必须知道所有细节以反映屏幕上的变化。项目二如何知道要刷新哪个项目以及屏幕上更新的数据是什么?这么说,我想知道 ObservableCollection 是如何构建的。它是否保留到原始列表项(来自项目一)的链接(地址)或保存它们的副本。换句话说,ObservableCollection 项目会改变,所以我只需要刷新 UI 吗?
  • ObservableCollection 是一个集合,它实现了INotifyCollectionChanged 接口,基本上说它有CollectionChanged 事件。 WPF 订阅此事件,因此它知道列表何时更改。可观察集合不知道源集合。所以,是的,除了手动让项目二知道发生了什么变化之外,别无他法,以便它可以在 UI 中反映出来——这里没有魔法。显然,您可以在项目一中使用 ObservableCollection - 但这对我来说是一种代码味道,因为您将向 BL 项目引入 UI 逻辑。
  • ObservableCollection 并非特定于 UI,并且通知外界有关业务组件更改的信息不是业务逻辑。为什么你认为你自己的事件不是 ui 逻辑而 CollectionChanged 是?
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2015-08-07
相关资源
最近更新 更多