5

我刚开始尝试使用 Laurent Bugnion 的MVVM Light Toolkit。我想我会非常喜欢它,但我有几个问题。

在我找到他们之前,让我解释一下我来自哪里。我目前结合使用 Josh Smith 的MVVM Foundation和 Codeplex 上另一个名为MVVM Toolkit的项目。我使用ObservableObjectMessenger来自 MVVM FoundationDelegateCommandCommandReference来自 MVVM Toolkit。

MVVM Foundation 和 MVVM Tookit 之间唯一真正的重叠是它们都有一个实现ICommand:MVVM FoundationRelayCommand和 MVVM Tookit DelegateCommand。在这两个中,DelegateCommand似乎更复杂。它采用了一个CommandManagerHelper使用弱引用来避免内存泄漏的方法。

话虽如此,这是我的问题:

  1. 为什么 MVVM Light 使用RelayCommand而不是DelegateCommand? ICommand出于某种原因,是否不必要或不推荐使用弱引用?

  2. ObservableObject为什么MVVM Light中没有?ObservableObject基本上只是ViewModelBase实现的一部分INotifyPropertyChanged,但是作为一个单独的类非常方便,因为视图模型不是唯一需要实现的对象INotifyPropertyChanged。例如,假设您有一个绑定到Person对象列表的 DataGrid。Person如果在用户查看 DataGrid 时其中的任何属性可以更改,则Person需要实现INotifyPropertyChanged. (我意识到如果Person是使用 LinqToSql 之类的东西自动生成的,它可能已经实现INotifyPropertyChanged了DataGrid 中的按钮列。)

谢谢。

PS 这是DelegateCommand来自 MVVM 工具包的代码:

https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU

4

3 回答 3

4

看起来第一个问题提出的问题已在最新版本中得到解决:

根据MVVM Light Toolkit Codeplex 站点(在“手动引发 CanExecuteChanged 事件”下),CommandManager已经完全消除了。

至于Observable Object,我在 Codeplex 站点上的问题跟踪器中添加了一个项目。

于 2011-03-04T21:11:53.113 回答
1

你也可以考虑卡特。它支持一个 DataObject(通用和非通用),它支持您正在寻找的内容(一个实现 INotifyPropertyChanged、IDataErrorInfo 等的对象)。然后,ViewModelBase 派生自非常强大的 DataObjectBase 类,因此您可以将 DataObjectBase 用于数据对象,将 ViewModelBase 用于视图模型。

它还使您免于创建信使,因为您可以简单地使用视图模型上的 InterestedIn 属性来接收另一个视图模型的更改通知。

于 2011-01-04T07:44:57.080 回答
0

您的两个问题都向我强烈建议您更喜欢使用比 View Model 概念更多的东西来定义业务逻辑。

DelegateCommand定义了一个独立于视图模型的类。这ObservableObject是一个独立于视图模型的类的实例。这不是规则,而是个人偏好:对于我来说,视图模型足以作为与视觉相关的业务逻辑容器。这可能会背叛我对 MVVM Light 的偏好——我目前并不认为缺乏这种偏好。

我不太确定 DataGrid 示例中发生了什么。我能说的是,DataGrid 不是很灵活——但是,在 WPF 中,DataGridTemplateColumn可以声明性地将视图模型绑定到视图(例如用户控件)。所以也许这是有道理的:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}">
        <v:YourViewWithButton/>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
于 2011-01-04T04:47:21.307 回答