2011-12-01 37 views
1

私はDelegateCommandプロパティを使用してButtonCommandプロパティにバインドするViewModelを持っています。PRISM DelegateCommand +サンプルデータ

問題は私のサンプルデータにDelegateCommandオブジェクトが好きではありません。それは文句を言います:The type "DelegateCommand" does not include any accessible constructors.また、公開されている唯一のプロパティはIsActiveプロパティです。

<local:MyViewModel xmlns:local="clr-namespace:MyNamespace" 
        xmlns:prism="http://www.codeplex.com/prism"> 
    <local:MyViewModel.Age>47</local:MyViewModel.Age> 
    <local:MyViewModel.PurchaseAlcohalCommand> 
     <prism:DelegateCommand IsActive="True" /> 
    </local:MyViewModel.PurchaseAlcohalCommand> 
</local:MyViewModel> 

答えて

1

DelegateCommandの代わりにICommandを公開するようにビューモデルを変更します。 DelegateCommandは単なるICommandの実装です。後でMvvmLightからRelayCommandに切り替えたい場合は、ビューとサンプルデータを気にする必要はありません。

これはあなたの問題を解決するとは確信していませんが、それは可能性があります。それだけで良いプログラミングの練習です。

+0

私はDelegateCommandを非公開にして、コマンドをICommandとしてキャストするための "ラッパー"プロパティを公開することを考えました。そうでなければ、ICommandの一部ではないため、 'PurchaseAlcohalCommand.RaiseCanExecuteChanged() DelegateCommandにキャストしなくても –

+0

ああ、RelayCommandはCommandManagerクラスに依存しているので、これを使う予定はありません。 –

+0

これは典型的に私のコマンドを公開する方法であり、この問題はサンプルデータでは見られませんでした。だから私はそれがあなたにもっと迷惑をかけるものであると思う。一般的に、あなたが見つけた問題のために、他の人がICommandを実装するのを避けます。コマンドオブジェクトに状態を更新するように指示するのは難しいです。オブジェクト指向設計の原則(具体的にはカプセル化)に続いて、コマンド自体はいつ更新すべきかを知っている必要があります。更新するように伝える必要はありません。 –

1

あなたのDelegateCommandの設定は、起動時に何もしません。それが望ましい動作であれば、私の提案は単にそれを宣言しないことです。 WPFは、nullICommandオブジェクトにバインドされていることを正常に処理します。

また、インスタンス化されたDelegateCommandにバインドする必要がある場合は、DelegateCommandをサブクラス化して、パラメータのないコンストラクタを含めることができます。

あなたはそれがDelegateCommandにバインドしたいとあなたはDelegateCommand、実際にはもう少し複雑になるだろうコマンドがトリガされ何かを、行うことを望んでいた場合。前述のサブクラスDelegateCommandを使用する必要がありますが、XAMLで代理人を定義することもできなければなりません。そこにサンプルがあると思いますが、マークアップ拡張やそのような性質のものが含まれていると思います。このアプローチの投資収益率は少し低いかもしれませんが、あなたの走行距離は異なる場合があります。あなたのViewModelのコンストラクタであなたのDelegateCommandsを定義します。これは通常が処理される方法です

最後にもう一つの代替。

+0

私はDelegateCommandをMarkupExtensionでサブクラス化して、設計時のコマンドを動作させることができると言っていますか?つまり、サンプルデータが失敗した場合、CanExecuteボタンはサンプルデータに基づいてすべて無効になりますか? –

+0

@ m-y:それは技術的に可能です。しかし、ViewModelのデフォルトのコンストラクタで同じDelegateCommandを定義すると、まったく同じ結果が得られ、すべてをXAMLに振り分ける方法を把握する必要はありません。ちょうど友好的な提案。私はこれがあなたに数回示唆されていることを知っています。それには正当な理由があります。 –

関連する問題