Caliburn Micro中的命令类

时间:2013-08-07 11:31:51

标签: mvvm caliburn.micro

在我尝试Caliburn.Micro的第一个项目中,我喜欢很多东西:-)

我想念(或尚未发现)的一件事是如何分离视图模型和命令。 CM不支持ICommand,因为它的处理方式是superior。我确信这是真的,所以我希望在正确的方向上做一点努力来实现这个目标,或者发现更好的方法。

据我所知,你必须将“Execute”方法和“CanExecute”属性直接放在viewmodel中,命名为与视图中的控件匹配,以使魔法工作。

我想将“Execute”和“CanExecute”放在viewmodel属性的不同对象中,然后CM会自动绑定到该对象,通常使用控件名称和属性名称。

来自Caliburn Micro论坛的

Repost,我没有得到任何答案,所以我在这里试试运气。

2 个答案:

答案 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。这样可以实现更清洁,更模块化的设计