我刚刚开始使用Caliburn.Micro,我在所有的例子中都注意到这些方法都是公开的。我决定通过添加一个按钮来测试:
x:Name="CloseMainWindow"
在我的VM中,我添加了一个方法:
private void CloseMainWindow()
{
TryClose();
}
当我单击按钮时,没有任何反应,我没有点击断点,但如果我将方法更改为公共,它就可以工作。 我不认为这是最好的方法。
为所有方法创建ICommand属性是否可以接受?
编辑:我刚刚阅读了上面问题的答案,Caliburn.Micro中没有也永远不会有ICommands。所以我原来的问题仍然需要一个答案,为什么一切都必须在VM中公开并且这样安全吗?
答案 0 :(得分:0)
我不知道你的意思是“这样安全吗?”。比什么更安全?
无论如何,Caliburn.Micro 可以设计为允许其约定绑定到私有方法,但这有一些缺点。首先,它不适用于部分信任环境,如Silverlight或XBAP或沙盒插件。您需要完全信任才能使用Reflection来访问私有成员,而Caliburn.Micro旨在能够以部分信任的方式运行(毕竟它确实支持Silverlight)。
但更大的原因是它会违反封装。这些是您打算从类外部调用的方法。 (毕竟,视图是一个单独的类;如果你在代码隐藏中自己连接它,你必须公开viewmodel方法。)有一个词“我打算从我自己的课外调用它“在语言规范中,那是public
。如果你设置了一些从类外部调用私有方法的魔法,你就会违反封装和最小惊讶原则,因为那不是private
的含义。
如果您真的希望能够绑定到私有方法,则可以自定义约定。但它会让你的代码更难理解,所以除非你能提出一个非常好的理由,否则我不会推荐它。