为什么要校准micro调用这种方法,何时不应该这样做?

时间:2012-09-24 15:17:20

标签: c# wpf caliburn.micro

我在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:

我发现如果绿色rect从left = 1(canvas.Left =“1”)开始,则不会发生这种情况。

1 个答案:

答案 0 :(得分:2)

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

  

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

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