【问题标题】:Binding viewmodel/model to a real data model将视图模型/模型绑定到真实数据模型
【发布时间】:2016-01-17 02:30:16
【问题描述】:

我是 MVVM 和 WPF 本身的新手。我需要在 WPF 中做一些原型设计并解决概念问题。

假设您有向您发送数据的服务器。无论您是否显示当前是否需要将其存储在缓存中,这都是您的“真实数据”,有时您需要将其放在 UI 上(当用户打开特定屏幕时),这就是您的视图模型。

我的问题很明显 - 我应该将 UI 绑定到存储在某个服务中的真实数据,还是应该围绕该数据进行视图模型包装并绑定到它? 在第一种情况下,除非我使用 Dispatcher,否则我会收到“调用线程无法访问此对象”异常,但在模型中调用 Dispatcher 看起来不正确

在后一种情况下,我需要:

  1. 将 90% 的数据从“真实模型”复制到包装器
  2. 手动观察底层“真实数据”的变化以更新视图模型,以防万一实现 INotifyPropertyChanged。

正确的方法是什么?

【问题讨论】:

    标签: wpf mvvm data-binding


    【解决方案1】:

    最合适的方式是让您的 ViewModel 与您的 View 需求非常相似。这意味着如果您的 View 有一个列表,那么您很可能在 ViewModel 上至少需要 2 个属性,一个用于 ItemSource,另一个用于选定的 Items。

    关于存储的真实数据,我想说的是,您的服务可以访问它。也许您使用 WPF 或 Silverlight,因此您将保护您的真实物理数据。并且可以交换视图所需的正确信息。

    我希望它有所帮助。如果您想分享您项目的一些建筑方面,我们可能会给您更多建议。

    【讨论】:

    • 谢谢你,拉斐尔。我正在做几乎相同的事情。剩下的唯一问题 - 如何:a) 让 UI 了解 POCO 本身的变化,b) 避免将太多数据字段从 POCO 复制到 UI 对象
    • 您可以为存储库创建一个项目,使用您的服务访问它,您还可以在 ViewModel 所需的数据和您的真实 POCO 数据之间创建转换。所以会有两个方面,“数据库”之类的方面和您的“视图”之类的方面。这个转换器将是统治者。如果您使用的是实体框架,我认为您是。最好创建一个通用助手来为您执行 CRUD。
    【解决方案2】:

    我确实更喜欢将数据缓存放在我称之为“服务层”(通过 WCF 或任何通信机制实际与服务器交互的客户端代码)中。

    数据缓存实际上是几个List<T>,我不在那里监听更改通知,因为实际上不需要。

    相反,您从 ViewModel 中使用这些“客户端服务”,并检索 List<T> 并将 ViewModel 中的项目存储在 ObservableCollection<T> 中。这样您就可以从 View 到 ViewModel 进行两种方式的绑定,而无需 View 与存储在“服务层”中的“较低级别”数据缓存进行交互。

    您在执行 ViewModel 操作时不需要使用 Dispatcher,因此这是一种更好的可扩展方法,因为您可以执行任何需要的多线程来检索数据。

    【讨论】:

    • 对,我也是这样,但假设您的缓存由 List 组成,如果在服务层修改其中一个 CacheObject,您将收到“调用线程无法访问此对象”例外。你是怎么避免的?谢谢!
    • 没有。我的缓存是实体列表(客户、产品、订单等)。这些是 POCO 对象并且没有线程关联,您会收到该错误,因为您尝试在不同的线程中修改 UI 对象。
    • 好的,我们越来越近了。是的,我的对象不是 100% POCO - 实际上它们是 POCO,但具有 INotifyPropertyChanged 接口。如果我让它们只是 POCO,那么我就失去了听到它们变化的能力,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2012-07-31
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多