2011-01-04 8 views
5

Laurent BugnionのMVVM Light Toolkitを試し始めました。私は本当にそれが好きになると思いますが、私はいくつかの質問があります。MVVM Light Toolkit - RelayCommands、DelegateCommands、およびObservableObjects

私がそれらに着く前に、私がどこから来ているのか説明しましょう。私は現在、ジョシュ・スミスのMVVM FoundationとCodeplexの別のプロジェクトMVVM Toolkitの組み合わせを使用しています。 MVVM FoundationのObservableObjectMessenger、MVVM ToolkitのDelegateCommandCommandReferenceを使用します。

MVVM財団とMVVM Tookitの間の唯一の本当の重複は、どちらもICommandの実装を持っていることです:MVVM財団はRelayCommandを持っており、MVVM TookitはDelegateCommandを持っています。この2つのうち、DelegateCommandはより洗練されているようです。弱い参照を使用してメモリリークを回避するCommandManagerHelperを採用しています。そうは言って

は、ここに私の質問は以下のとおりです。

  1. なぜMVVMライトではなくDelegateCommandよりもRelayCommandを使用していますか? ICommandの弱い参照の使用は不要か、なんらかの理由で推奨されていませんか?

  2. MVVM LightにはなぜObservableObjectがありませんか? ObservableObjectINotifyPropertyChangedを実装するViewModelBaseの基本的な部分ですが、ビューモデルがINotifyPropertyChangedを実装する必要がある唯一のオブジェクトではないため、別のクラスとして持つのが非常に便利です。たとえば、PersonオブジェクトのリストにバインドするDataGridがあるとします。ユーザーがDataGridを表示しているときにPersonのいずれかのプロパティが変更される可能性がある場合、PersonINotifyPropertyChangedを実装する必要があります。 (PersonがLinqToSqlのようなものを使って自動生成された場合、おそらくすでにINotifyPropertyChangedが実装されているはずですが、私はコマンドを含める必要があるため、ビュー固有のバージョンのエンティティモデルオブジェクトを作成する必要がある場合がありますDataGridのボタン列をサポートしています)。

ありがとうございました。

P.S.ここMVVMツールキットからDelegateCommandのコードは次のとおりです。

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

答えて

4

は、最新のビルドで解決されました:

The MVVM Light Toolkit Codeplex site(「手動CanExecuteChangedイベントを上げる」の下)によると、CommandManagerは完全に排除されています。

Observable Objectについては、Codeplexサイトにan item to the Issue Trackerを追加しました。

+0

ObservableObjectも実装されました。 – devuxer

0

ご質問の両方が強く、ビジネス・ロジックを定義するビューモデルの概念よりも何か以上を使用することを好むことを私に示唆しています。

DelegateCommandは、個別のクラスをビューモデルとは別に定義しています。 ObservableObjectは、ビューモデルとは別にクラスのインスタンスです。これはルールではなく、個人的な好みです。ビジョンに関するビジネスロジックのコンテナとしてビューモデルで十分です。これはMVVM Lightの私の好みを裏切るかもしれない---私は現時点で欠けているとは思わない。

DataGridの例では何が起こっているのかはっきりしていません。私が言うことは、DataGridはあまり柔軟ではないということです。しかし、WPFでは、DataGridTemplateColumnはビューモデルをビュー(例:ユーザーコントロール)に宣言的にバインドできます。だから、おそらく、これは理にかなって:

<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}"> 
     <v:YourViewWithButton/> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 
+0

'RelayCommand'も別のクラスです。 'ViewModelBase'もそうです。私のDataGridの例では、それは単なる用語の問題かもしれません。 MVVMの* view-models *は、DataContextを通してViewsにバインドするものだと思います。しかし、私はドメインオブジェクト(エンティティ)のビューモデルを持つこともできると思います。例えば、 'Person'は' DateOfBirth'プロパティを持つかもしれません。 'PersonViewModel'には、' Age'、 'IsSelected'(DataGridチェックボックス列で使用)、' ToggleSelectionCommand'(DataGridボタン列で使用する)のような追加のプロパティがあります。 – devuxer

+0

@DanM通常、私のドメインオブジェクトはviewmodelの一部です。例えば、あなたの場合、私はicollection 、selectedPersonプロパティを持っているでしょう、そして、私は選択された人にバインドされた別個のプロパティとして人のプロパティを持っています。 – ecathell

0

またCatelを考慮することができます。これは、探しているもの(INotifyPropertyChanged、IDataErrorInfoなどを実装しているオブジェクト)を正確にサポートするDataObject(汎用と非汎用の両方)をサポートします。次に、ViewModelBaseは非常に強力なDataObjectBaseクラスから派生しているため、データオブジェクトにはDataObjectBaseを、ビューモデルにはViewModelBaseを使用できます。

また、ビューモデルのinterestedIn属性を使用して、別のビューモデルの変更通知を受け取ることができるため、メッセンジャーを作成できなくなります。それは最初の質問が提起した問題のように見えます

関連する問題