1

次のように、caliburn micro にビューとビューモデルがあります。

見る:

 <Canvas>

         <Rectangle x:Name="CloseApp" Canvas.Top="0" Canvas.Left="0" Fill="green" Opacity="0.2" Height="20" Width="30" />
          <Rectangle x:Name="MoveWindow" Canvas.Top="0" Canvas.Left="60" Fill="red" Opacity="0.2" Height="20" Width="964" cal:Message.Attach="[Event MouseLeftButtonDown] = [Action MoveWindow]" />
</Canvas>

およびViewModel

  /// </summary>
    public void MoveWindow()
    {
        Window view = this.GetView(null) as Window;

        if (view != null)
        {
            view.DragMove();
        }
    }
    public void CloseApp()
    {

    }

赤い四角形をクリックしてドラッグすると、左ボタンを放した後、Caliburn micro が CloseApp を呼び出すことに気付きました。

これを行う必要があるのに、なぜこのメソッドを呼び出すのですか?

編集1:

緑の四角形が left=1 (canvas.Left="1") から始まる場合、これは起こらないことがわかりました。

4

1 に答える 1

2

Caliburn.Microは、添付するメッセージを明示的に指定しない場合、規則ベースのコマンドモデルにフォールバックします。コントロールの名前に一致するVM上のメソッドを検索し、自動的に接続します。これを行うために、いくつかのイベントに自動的に接続されます。これをオーバーライドするには、Rectangle "CloseApp"の名前を変更するか、Rectangle "CloseApp"に独自のアクションメッセージを追加するか、CloseApp()というメソッドの名前を変更します。

規則バインディングの要素を見つけた後、ViewModelBinderが次に行うことは、ViewModelのメソッドと一致するかどうかを検査することです。これは、少しのリフレクションを使用してViewModelのパブリックメソッドを取得することによって行われます。次に、それらをループして、要素との大文字と小文字を区別しない名前の一致を探します。一致するものが見つかり、既存のインタラクションがない場合、要素にトリガーが付けられ、アクションがアタッチされます。既存のトリガーのチェックは、従来のシステムが、開発者がマークアップで明示的に宣言したものと重複するアクションを作成するのを防ぐために使用されます。安全のため、一致した要素でトリガーを宣言した場合はスキップされます。

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions&referringTitle=Documentationから

于 2012-10-24T04:38:57.000 に答える