0

Caliburn.Micro を使い始めたばかりで、すべての例でメソッドがすべて公開されていることに気付きました。次のボタンを追加して、これをテストすることにしました。

x:Name="CloseMainWindow"

VM にメソッドを追加しました。

private void CloseMainWindow()
{
  TryClose();
}

ボタンをクリックしても何も起こらず、ブレークポイントに到達しませんが、メソッドをパブリックに変更すると機能します。これが最善の方法だとは思えません。

すべてのメソッドに対して ICommand プロパティを作成することは、許容できる解決策でしょうか?

編集:すぐ上の質問への回答を読んだところですが、Caliburn.Micro には ICommands はありません。したがって、私の最初の質問にはまだ回答が必要です.なぜすべてを VM で公開する必要があり、これは安全なのでしょうか?

4

1 に答える 1

0

「これは安全ですか?」の意味がわかりません。何より安全?

とにかく、Caliburn.Microは、その規則がプライベート メソッドにバインドできるように設計されている可能性がありますが、これにはいくつかの欠点がありますまず、Silverlight、XBAP、サンドボックス化されたプラグインなどの部分信頼環境では機能しません。Reflection を使用してプライベート メンバーにアクセスするには完全な信頼が必要であり、Caliburn.Micro は部分信頼で実行できるように設計されています (結局のところ、Silverlight をサポートしています)。

しかし、より大きな理由は、カプセル化に違反することです。これらは、クラスの外部から呼び出されるメソッドです。(結局のところ、ビューは別のクラスです。コード ビハインドで自分で接続する場合は、viewmodel メソッドを public にする必要があります。) 「自分のクラスの外からこれを呼び出すつもりです」という言葉があります。 "言語仕様で、それはpublic. クラスの外部からプライベート メソッドを呼び出す魔法を設定すると、カプセル化と最小驚きの原則の両方に違反することになりますprivate

プライベート メソッドにバインドできるようにしたい場合は、規則をカスタマイズできます。しかし、それはあなたのコードを理解するのを非常に難しくするので、あなたが本当に正当な理由を思いつくことができない限り、私はお勧めしません.

于 2012-04-27T13:20:59.193 に答える