【问题标题】:C# architecture: WPF UI bindings to a non-UI modelC# 架构:WPF UI 绑定到非 UI 模型
【发布时间】: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&lt;T&gt; 在 System.dll 中定义。我认为这根本与任何 UI 框架无关。
  • 此示例听起来与您遇到的问题相同:Link。他提出了两种解决方案,更有趣的一种是通过创建代理:His Solution
  • 就我个人而言,我只是在模型的属性上保留 ObservableCollection 和 Property Notification。我已经看到了两种方式的争论,但对我来说它让事情变得容易。我找到了ObservableCollection 的线程安全实现。
  • @jsirr13 - 感谢您的 cmets,特别是链接,我用它来实现我想要的。

标签: c# wpf binding


【解决方案1】:

创建实现 INotifyPropertyChanged 的​​代理类以及 ObservableCollections(AutoMapper 帮助在它们之间切换)

或者将这些功能直接添加到您的模型对象中。

我通常将此添加到模型中,因为更改属性时的通知不是特定于 UI(是的 UI 确实使用它,但您将来可能需要在其他地方使用它,例如,如果您需要一个类来监听如果子类改变了它的值)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多