【问题标题】:Why caliburn micro calls this method, when it should not do this?为什么 caliburn micro 在不应该这样做的时候调用这个方法?
【发布时间】:2012-09-24 15:17:19
【问题描述】:

我在 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") 开始,这不会发生。

【问题讨论】:

  • 很奇怪。原因似乎是对view.DragMove() 的调用。没有那行,CloseApp 就不会被调用。

标签: c# wpf caliburn.micro


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2015-10-14
    • 2017-03-06
    • 2012-02-02
    相关资源
    最近更新 更多