我刚刚开始尝试使用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。如果用户在查看DataGrid时可以更改Person
的任何属性,则Person
需要实现INotifyPropertyChanged
接口。(我意识到如果Person
是使用LinqToSql之类的自动生成的,则它可能已经实现了INotifyPropertyChanged
接口,但还有一些情况,我需要创建特定于视图的实体模型对象版本,以支持DataGrid中的按钮列命令等功能。)
谢谢。
P.S. 这是来自MVVM Toolkit的DelegateCommand
代码:
https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU
ObservableObject
已经被实现了。 - devuxer