0

我刚开始使用 Caliburn.Micro,我注意到所有示例中的方法都是公开的。我决定通过添加一个按钮来测试它:

x:Name="CloseMainWindow"

在我的虚拟机中,我添加了一个方法:

private void CloseMainWindow()
{
  TryClose();
}

当我单击按钮时,什么也没有发生,我也没有遇到断点,但是如果我将方法更改为 public,它就可以工作。我看不出这是最好的方法。

为所有方法创建 ICommand 属性是可接受的解决方案吗?

编辑:我刚刚阅读了上面问题的答案,Caliburn.Micro 中没有也永远不会有 ICommands。所以我最初的问题仍然需要一个答案,为什么所有东西都必须在 VM 中公开,这是否安全?

4

1 回答 1

0

我不知道您所说的“这安全吗?”。比什么更安全?

无论如何,Caliburn.Micro本来可以设计为允许其约定绑定到私有方法,但这有几个缺点。首先,它不能在部分信任的环境中工作,例如 Silverlight 或 XBAP 或沙盒插件。您需要完全信任才能使用 Reflection 访问私有成员,而 Caliburn.Micro 旨在能够在部分信任下运行(毕竟它确实支持 Silverlight)。

但更大的原因是它会违反封装。这些是您打算从类外部调用的方法。(毕竟,视图是一个单独的类;如果您在代码隐藏中自己连接它,则必须将 viewmodel 方法公开。)有一个词表示“我打算从我自己的类之外调用它" 在语言规范中,那是public. 如果你设置了一些从类外部调用私有方法的魔法,那么你就违反了封装和最小惊讶原则,因为这不是什么private意思。

If you really want to be able to bind to private methods, you can customize the conventions. But it would make your code much harder to understand, so I wouldn't recommend it unless you can come up with a really good justification.

于 2012-04-27T13:20:59.193 回答