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>

和视图模型

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

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

    }

我注意到,当我单击红色矩形并拖动它时,释放左键后,Caliburn 微调用 CloseApp。

为什么它应该这样做时调用这个方法?

编辑1:

我发现如果绿色矩形从 left=1 (canvas.Left="1") 开始,这不会发生。

4

1 回答 1

2

如果您没有明确指定要附加的消息,Caliburn.Micro 会退回到基于约定的命令模型,它会在您的 VM 上查找与控件名称匹配的方法并自动将其连接起来。它会自动连接到一些事件来执行此操作。要覆盖它,要么更改矩形“CloseApp”的名称,要么在矩形“CloseApp”上添加您自己的操作消息,或者更改名为 CloseApp() 的方法的名称。

ViewModelBinder 在找到约定绑定的元素后要做的下一件事是检查它们是否与 ViewModel 上的方法匹配。它通过使用一点反射来获取 ViewModel 的公共方法来做到这一点。然后循环遍历它们,寻找与元素匹配的不区分大小写的名称。如果找到匹配项,并且元素上没有任何预先存在的 Interaction.Triggers,则附加一个动作。检查预先存在的触发器用于防止约定系统创建与开发人员可能在标记中明确声明的重复操作。为了安全起见,如果您在匹配的元素上声明了任何触发器,则会跳过它。

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

于 2012-10-24T04:38:57.000 回答