我刚刚开始尝试Laurent Bugnion的 MVVM轻型工具包. 。我想我会非常喜欢它,但是我有几个问题。

在找他们之前,让我解释一下我的来源。我目前使用了乔什·史密斯(Josh Smith)的组合 MVVM基金会 还有另一个关于Codeplex的项目称为 MVVM工具包. 。我用 ObservableObjectMessenger 来自MVVM基金会和 DelegateCommandCommandReference 来自MVVM工具包。

MVVM基金会和MVVM Takeit之间唯一真正的重叠是,它们俩都有实施 ICommand: :MVVM基金会有 RelayCommand MVVM Takeit有 DelegateCommand. 。这两个, DelegateCommand 似乎更复杂。它使用a CommandManagerHelper 这使用弱参考来避免内存泄漏。

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

  1. 为什么MVVM使用轻型 RelayCommand 而不是 DelegateCommand?是使用弱参考 ICommand 不必要还是由于某种原因不推荐?

  2. 为什么没有 ObservableObject 在MVVM光中? ObservableObject 基本上只是 ViewModelBase 实施 INotifyPropertyChanged, ,但是将其作为单独的类非常方便,因为视图模型不是唯一需要实现的对象 INotifyPropertyChanged. 。例如,假设您有一个绑定到列表的datagrid Person 对象。如果有任何属性 Person 在用户查看数据杂志时可以更改, Person 需要实施 INotifyPropertyChanged. 。 (我意识到如果 Person 使用linqtosql之类的东西自动生成,它可能已经实现了 INotifyPropertyChanged, ,但是在某些情况下,我需要制作实体模型对象的特定视图版本,因为我需要包括一个命令来支持数据杂志中的按钮列。)

谢谢。

PS这是代码 DelegateCommand 从MVVM工具包:

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

有帮助吗?

解决方案

看来第一个问题提出的问题已在最新的构建中解决:

根据 MVVM轻型工具包编码网站 (在“手动提高canexecutechanged活动”下), CommandManager 已经完全消除了。

至于 Observable Object, , 我已经添加了 问题跟踪器的项目 在Codeplex网站上。

其他提示

你也可以考虑 catel. 。它支持一个dataObject(无论是通用还是非传播),它准确地支持您正在寻找的东西(实现InotifyPropertyChanged,IdataErrorinfo等的对象等等)。然后,ViewModelBase是从非常强大的DataObjectBase类派生的,因此您可以将DataObjectBase用于数据对象,而ViewModelBase用于视图模型。

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

您的两个问题都强烈建议您使用某些东西 更多的 比定义业务逻辑的视图模型概念。

DelegateCommand 定义a 分离 除视图模型外。这 ObservableObject 是一个实例 分离 除视图模型外。这不是一条规则,而是当下的个人偏好:视图模型足以使我作为业务逻辑的容器,与视觉效果有关。这可能背叛了我对MVVM Light的偏爱 - 我目前尚未发现。

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

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}">
        <v:YourViewWithButton/>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top