【发布时间】:2014-04-03 16:00:53
【问题描述】:
我对 C# 和 WPF 比较陌生,所以请原谅我在这个问题上缺乏明确性。
我将我的数据模型开发为一个类库,这样它就不会与特定的 UI 框架或任何 UI 相关联。这是有充分理由的,因为该库可用于支持多种 UI 实现。
假设它看起来像这样:
public class MyDataStore
{
public string Title { get; private set; }
public List<MyDataRecord> Records { get; private set; }
}
然后我有一个用于查看和操作此数据模型的 UI;假设它是一个带有 DataGrid 的 WPF 表单。
现在您不能绑定到List,这很好。
如果这完全是一个 UI 项目,我可以简单地将 Records 更改为 ObservableCollection,但这不适合这个库 - 除了它的原则,我从工作线程更新列表,你不能推送如果您不了解 UI,则将该操作应用于 UI 线程。
直接手动替换是维护每个列表项的事件订阅,并通过层次结构将其级联 - ick。或者,UI 必须采用基于每个项目的订阅,这与它当前以自上而下的方式处理所有内容的状态不同。
我可以想到一些可以解决此问题的设计,但这一定是一个常见问题:是否有适当的设计、模式或框架来获得绑定的好处和易用性,同时保持不同的 UI 和模型分离?
【问题讨论】:
-
and you can't push that operation onto a UI thread if you don't know about a UI.- 我已经通过抽象Dispatcher解决了这个问题。你也可以TaskFactory.FromCurrentSynchronizationContext(); -
Anways,
System.Collections.ObjectModel.ObservableCollection<T>在 System.dll 中定义。我认为这根本与任何 UI 框架无关。 -
此示例听起来与您遇到的问题相同:Link。他提出了两种解决方案,更有趣的一种是通过创建代理:His Solution
-
就我个人而言,我只是在模型的属性上保留 ObservableCollection 和 Property Notification。我已经看到了两种方式的争论,但对我来说它让事情变得容易。我找到了ObservableCollection 的线程安全实现。
-
@jsirr13 - 感谢您的 cmets,特别是链接,我用它来实现我想要的。