【发布时间】:2011-06-03 04:25:42
【问题描述】:
我刚开始尝试使用 Laurent Bugnion 的 MVVM Light Toolkit。我想我会非常喜欢它,但我有几个问题。
在我找到他们之前,让我解释一下我来自哪里。我目前使用 Josh Smith 的 MVVM Foundation 和 Codeplex 上另一个名为 MVVM Toolkit 的项目的组合。我使用来自 MVVM Foundation 的 ObservableObject 和 Messenger 以及来自 MVVM Toolkit 的 DelegateCommand 和 CommandReference。
MVVM Foundation 和 MVVM Tookit 之间唯一真正的重叠是它们都有一个ICommand 的实现:MVVM Foundation 有RelayCommand,而 MVVM Tookit 有DelegateCommand。在这两个中,DelegateCommand 似乎更复杂。它使用了一个CommandManagerHelper,它使用弱引用来避免内存泄漏。
话虽如此,以下是我的问题:
为什么 MVVM Light 使用
RelayCommand而不是DelegateCommand?在ICommand中使用弱引用是否不必要或出于某种原因不推荐?为什么 MVVM Light 中没有
ObservableObject?ObservableObject基本上只是实现INotifyPropertyChanged的ViewModelBase的一部分,但是作为一个单独的类非常方便,因为视图模型不是唯一需要实现INotifyPropertyChanged的对象。例如,假设您有一个绑定到Person对象列表的DataGrid。如果Person中的任何属性可以在用户查看DataGrid 时更改,Person将需要实现INotifyPropertyChanged。 (我意识到如果Person是使用 LinqToSql 之类的东西自动生成的,它可能已经实现了INotifyPropertyChanged,但是在某些情况下,我需要制作实体模型对象的视图特定版本,例如,因为我需要在 DataGrid 中包含一个支持按钮列的命令。)
谢谢。
附:这是 MVVM 工具包中DelegateCommand 的代码:
https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU
【问题讨论】:
标签: wpf mvvm mvvm-light mvvm-foundation