2012-07-02 51 views
2

我正在为我的WPF项目创建BaseViewModel,它是从DynamicObject派生的,我不太确定如何处理实体的属性更改'与主要实体(视图模型中主要实体的导航属性)相关“。MVVM DynamicObject +实体框架STE实体+属性更改行为

例如:

VM:

​​3210

这将是VM的客户CRUD,例如。并且Customer实体例如具有称为Address(地址类型的实体)的导航属性。

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

我知道解释可能不够清楚,我只是不知道如何用我可怜的英语解释自己。

我的问题是:通用的基于DynamicObject的虚拟机如何处理需要为属性定义行为的场景,而不是主要实体的一部分?

回答

1

我最终通过在System.Dynamic.DynamicObject.TryGetMember'getter'方法中使用缓存的BaseViewModels实例包装导航属性来解决此问题。不知道它是最高性能的解决方案,但我始终可以在派生实体视图模型中强制键入“导航视图模型”。

0

如果您的模型(在本例中为客户)实现了INotifyPropertyChanged界面,viewMoodel可以注册到模型PropertyChanged事件。通过这种方式,ViewModel可以获知发生的任何财产变化,并可以做出相应的反应。

+0

该解决方案需要为整个图中的每个实体订阅Propertychanged事件,这对我来说看起来不太优雅。此外,我不喜欢必须订阅虚拟机来模拟事件的事实,因为那样每次显示不同的模型时我都需要订阅和取消订阅。我也在寻找一个可以在框架级别实现的通用解决方案(我的意思是抽象通用BaseViewModel级别) –

+1

反正你需要某种注册/注销功能,这些功能必须是你的框架的一部分。但是,也许这将是一个更优雅的方法: 考虑引入一个接口,如IModel,它有一个方法,例如RegisterCallback(动作回调)以获取模型的反馈。这更好,因为只有一个Model与一个ViewModel进行通信。然后让ViewModel注册/取消注册新的回调,每当引入新模型时。最后但并非最不重要的是将泛型类定义约束为实现IModel的类。 –