MVVM Light Toolkit -RelayCommands、DelegateCommands、ObservableObjects
-
15-10-2019 - |
質問
Laurent Bugnion'sの実験を始めたばかりです MVVMライトツールキット. 。私はそれが本当に好きになると思いますが、いくつか質問があります。
私が彼らに到達する前に、私がどこから来たのかを説明させてください。私は現在、ジョシュ・スミスの組み合わせを使用しています MVVM Foundation CodePlexの別のプロジェクトが呼び出されました MVVMツールキット. 。私が使う ObservableObject
と Messenger
MVVM Foundationから DelegateCommand
と CommandReference
MVVMツールキットから。
MVVM FoundationとMVVM TakeTの間の唯一の実際の重複は、両方ともの実装を持っていることです ICommand
: :MVVM Foundationがあります RelayCommand
そして、MVVM Tockitは持っています DelegateCommand
. 。これら2つのうち、 DelegateCommand
より洗練されているようです。 aを使用します CommandManagerHelper
これは、メモリリークを回避するために弱い参照を使用します。
とはいえ、ここに私の質問があります:
なぜMVVMが光を使用するのか
RelayCommand
それよりもDelegateCommand
? anでの弱い参照の使用ですICommand
何らかの理由で不要または推奨されていませんか?なぜいないのですか
ObservableObject
MVVMライトで?ObservableObject
基本的にの一部ですViewModelBase
それは実装していますINotifyPropertyChanged
, 、しかし、ビューモデルが実装する必要があるオブジェクトだけではないため、別のクラスとして持つことは非常に便利ですINotifyPropertyChanged
. 。たとえば、のリストにバインドするデータグリッドがあるとしましょうPerson
オブジェクト。のいずれかのプロパティの場合Person
ユーザーがDatagridを表示している間に変更できます。Person
実装する必要がありますINotifyPropertyChanged
. 。 (私はそれを理解していますPerson
linqtosqlのようなものを使用して自動生成されている場合、おそらくすでに実装されますINotifyPropertyChanged
, 、しかし、Entity Modelオブジェクトのビュー固有のバージョンを作成する必要がある場合があります。たとえば、Datagridでボタン列をサポートするコマンドを含める必要があるためです。)
ありがとう。
PSここにコードがあります DelegateCommand
MVVMツールキットから:
https://docs.google.com/document/pub?id=1apcx5sbcfhi5fbhv8ki3za6j34sp2t80lqzdj89v8cu
解決
最初の質問によって提起された問題は、最新のビルドで解決されたようです。
によると MVVMライトツールキットCODEPLEXサイト (「Canexectechangedイベントの手動での上昇」の下)、 CommandManager
完全に排除されました。
はどうかと言うと Observable Object
, 、 私が追加しました 問題トラッカーのアイテム CodePlexサイトで。
他のヒント
あなたも考慮することができます カテル. 。これは、探しているもの(inotifyPropertyChanged、idataerrorinfoなどを実装するオブジェクト)を正確にサポートするデータオブジェクト(汎用と非genericの両方)をサポートします。次に、ViewModelbaseは非常に強力なDataObjectBaseクラスから派生しているため、データオブジェクトのDataObjectBaseを使用し、ViewModelbaseをビューモデルに使用できます。
また、ビューモデルでAcconestIn属性を使用して別のビューモデルの変更通知を受け取るだけであるため、メッセンジャーの作成からも節約できます。
あなたの質問はどちらも私に何かを使うことを好むことを強く示唆しています もっと ビューモデルの概念よりも、ビジネスロジックを定義します。
DelegateCommand
aを定義します 分ける ビューモデル以外のクラス。 ObservableObject
aのインスタンスです 分ける ビューモデル以外のクラス。これはルールではなく、瞬間の個人的な好みです。ビューモデルは、ビジュアルに関連するビジネスロジックのコンテナとして十分です。これは、MVVMライトに対する私の好みを裏切るかもしれません---私は現時点では不足していないと思います。
Datagridの例で何が起こっているのかはわかりません。私が言えることは、Datagridがそれほど柔軟ではないということです - しかし、WPFでは、 DataGridTemplateColumn
ビューモデルをビュー(ユーザーコントロールなど)に宣言的に結合できます。だからおそらくこれは理にかなっています:
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataView="{x:Type m:YourViewModelForButton}">
<v:YourViewWithButton/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>