【问题标题】:MVVM DynamicObject + Entity Framework STE entities + Property Change BehaviorMVVM DynamicObject + 实体框架 STE 实体 + 属性更改行为
【发布时间】:2012-07-02 15:01:37
【问题描述】:

我正在为我的 WPF 项目创建 BaseViewModel,它派生自 DynamicObject,我不确定如何处理与主实体“相关”的实体的属性更改(导航属性视图模型中的主要实体)。

例如:

虚拟机:

 public class CustomerCRUDViewModel: BaseEntityViewModel<Customer>
    {
        ...
    }

例如,这将是客户 CRUD 的 VM。例如,客户实体有一个导航属性,称为地址(地址类型的实体)。

现在的问题是,当将视图绑定到 Address 中的属性时,更改不会报告给 VM,而是直接报告给实体,因此不会触发 VM 级别中定义的任何行为。

我知道解释可能不够清楚,我只是不知道如何用我糟糕的英语更好地解释自己。

我的问题是:通用的基于 DynamicObject 的 VM 如何处理我需要为不属于主实体的属性定义行为的场景?

【问题讨论】:

    标签: c# wpf entity-framework mvvm dynamicobject


    【解决方案1】:

    我最终通过在 System.Dynamic.DynamicObject.TryGetMember 'getter' 方法中使用缓存的 BaseViewModels 实例包装导航属性解决了这个问题。虽然不确定这是性能最高的解决方案,但我总是可以在派生实体视图模型中强烈键入我的“导航视图模型”。

    【讨论】:

      【解决方案2】:

      如果您的模型(在本例中为客户)实现了 INotifyPropertyChanged 接口,则 viewMoodle 可以注册到模型 PropertyChanged 事件。通过这种方式,ViewModel 可以了解发生的任何属性更改,并可以做出相应的反应。

      【讨论】:

      • 该解决方案需要为整个图中的每个实体订阅 Propertychanged 事件,这对我来说看起来不太优雅。此外,我不喜欢必须为 VM 订阅模型事件的事实,因为这样每次显示不同的模型时我都需要订阅和取消订阅。我也在寻找可以在框架级别实现的通用解决方案(我的意思是抽象的通用 BaseViewModel 级别)
      • 无论如何,您都需要某种注册/注销功能,这必须是您框架的一部分。但也许这会是一种更优雅的方法:考虑引入一个接口,比如 IModel,它有一个方法,例如RegisterCallback(Action callback) 以便从模型中获取反馈。这更好,因为只有一个模型与一个 ViewModel 通信。然后让 ViewModel 注册/注销一个新的回调,每当引入新模型时。最后但并非最不重要的一点是将泛型类定义限制为实现 IModel 的类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多