我在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”)开始,则不会发生这种情况。
答案 0 :(得分:2)
如果您没有明确指定要附加的消息,Caliburn.Micro将回退到基于约定的命令模型,它将在您的VM上查找与控件名称匹配的方法并自动连接它。它会自动连接到某些事件来执行此操作。要覆盖它,要么更改Rectangle“CloseApp”的名称,要么在Rectangle“CloseApp”上添加自己的操作消息,或者更改名为CloseApp()的方法的名称。
ViewModelBinder接下来会做的事情 找到约定绑定的元素是检查它们 匹配ViewModel上的方法。它通过使用一点来做到这一点 反射获取ViewModel的公共方法。然后循环 在他们身上寻找与元素不区分大小写的名称。 如果找到匹配项,并且没有任何预先存在的匹配项 关于元素的Interaction.Triggers,附加了一个动作。支票 对于预先存在的触发器,用于阻止约定系统 从创建重复操作到开发人员可能拥有的操作 在标记中明确声明。为了安全起见,如果有的话 声明匹配元素上的任何触发器,它被跳过。