在我尝试Caliburn.Micro的第一个项目中,我喜欢很多东西:-)
我想念(或尚未发现)的一件事是如何分离视图模型和命令。 CM不支持ICommand,因为它的处理方式是superior。我确信这是真的,所以我希望在正确的方向上做一点努力来实现这个目标,或者发现更好的方法。
据我所知,你必须将“Execute”方法和“CanExecute”属性直接放在viewmodel中,命名为与视图中的控件匹配,以使魔法工作。
我想将“Execute”和“CanExecute”放在viewmodel属性的不同对象中,然后CM会自动绑定到该对象,通常使用控件名称和属性名称。
来自Caliburn Micro论坛的Repost,我没有得到任何答案,所以我在这里试试运气。
答案 0 :(得分:2)
您应该尽量避免使Law of Demeter无效。因此,在视图模型上,您可以使用执行方法和CanExecute
属性(通常计算),这些属性可以在适当的时候调用包含模型,例如:
public void Save
{
// .. save logic
}
public bool CanSave
{
get
{
return this.model.CanSave ... and other logic etc.
}
}
您必须记住在可以保存状态更改时通知计算属性的更改,例如:
public void CodeThatGetsRunWhenAPropertyOfTheModelChanges()
{
this.NotifyOfPropertyChanged(() => this.CanSave);
}
如果您有例如Button
在您的视图上x:Name="Save"
,然后Caliburn.Micro会在点击按钮时自动调用视图模型上的Save
动词,并会在按下时自动启用和禁用按钮CanSave
属性值更改。
答案 1 :(得分:2)
为避免胖ViewModels,您还需要避免胖视图。 Caliburn.Micro允许您按照屏幕, Conductors and Composition中的描述构建视图/视图模型。
简短版本是,您可以在“MasterView”/“MasterViewModel”shell中包含“DetailView”和“DetailViewModel”对,方法是在MasterViewModel中定义DetailViewModel类型属性,并在MasterView中添加以其命名的ContentControl。绑定和操作照常工作,因此您可以避免胖模型/视图和命令路由。
另一种选择是将MasterView元素绑定到DetailViewModel属性或操作,方法是将detail的属性添加到目标的名称。我还找不到具体的URL,所以示例来自内存。
假设您有以下课程:
public class MasterViewModel:Screen
{
public property DetailViewModel MyDetails{get;set;}
}
和
public class DetailViewModel:Screen
{
public property string SomeText{get;set;}
public void DoTheBoogie(){}
}
您可以在MasterView中添加名为“MyDetails_SomeText”的控件以绑定到DetailViewModel.SomeText。你也可以用同样的方式绑定到DoTheBoogie。
我更喜欢创建一个单独的View,名为DetailView,并在MasterView中添加名为“MyDetails”的ContentControl。这样可以实现更清洁,更模块化的设计