Mvvm Caliburn Micro中的命令类

Mvvm Caliburn Micro中的命令类,mvvm,caliburn.micro,Mvvm,Caliburn.micro,在我第一个尝试Caliburn.Micro的项目中,我喜欢很多东西:-) 我遗漏(或尚未发现)的一件事是如何分离viewmodel和命令。 CM不支持ICommand,因为它的工作方式是。我相信这是真的,所以我希望朝着正确的方向做一点小小的努力,或者找到更好的方法 据我所知,您必须将“Execute”方法和“CanExecute”属性直接放在viewmodel中,命名为与视图中的控件匹配,才能让魔术发挥作用 我想将“Execute”和“CanExecute”放在viewmodel属性的另一个对象

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

我遗漏(或尚未发现)的一件事是如何分离viewmodel和命令。 CM不支持ICommand,因为它的工作方式是。我相信这是真的,所以我希望朝着正确的方向做一点小小的努力,或者找到更好的方法

据我所知,您必须将“Execute”方法和“CanExecute”属性直接放在viewmodel中,命名为与视图中的控件匹配,才能让魔术发挥作用

我想将“Execute”和“CanExecute”放在viewmodel属性的另一个对象中,然后CM会像往常一样使用控件名和属性名自动绑定到该对象


在Caliburn Micro的论坛上,我没有得到任何答案,所以我在这里试试运气。

你应该尽量避免使这个问题无效。因此,在视图模型上,可以有一个execute方法和一个
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);
} 

如果您在视图上使用
x:Name=“Save”
按钮,则当单击按钮时,Caliburn.Micro将自动调用视图模型上的
Save
动词,当属性值更改时,会自动启用和禁用按钮。

要避免胖视图模型,还需要避免胖视图。Caliburn.Micro允许您按照屏幕中的说明组合视图/视图模型

简短的版本是,通过在MasterViewModel中定义DetailViewModel类型的属性并在MasterView中添加以其命名的ContentControl,可以在“MasterView”/“MasterViewModel”shell中包含“DetailView”和“DetailViewModel”对。绑定和操作照常工作,因此您可以避免fat模型/视图和命令路由

另一个选项是通过在目标名称前加上详图属性,将MasterView元素绑定到DetailViewModel属性或动作。我还找不到具体的URL,所以这个例子是从内存中得到的

假设您拥有以下类别:

public class MasterViewModel:Screen
{
    public property DetailViewModel MyDetails{get;set;}
}

您可以在MasterView中添加名为“MyDetails\u SomeText”的控件,以绑定到DetailViewModel.SomeText。你也可以用同样的方法绑定到DoTheBoogie


我更喜欢创建一个单独的视图,名为DetailView,并在MasterView中添加一个名为“MyDetails”的ContentControl。这使得设计更简洁、更模块化

您能更清楚地问一下,您对什么感到困惑或需要更多信息吗?我不完全理解你的问题,特别是最后一部分关于在不同的对象中放置“Execute”和“CanExecute”?听起来你想创建一个命令处理程序类型的对象,它将用作命令的绑定源。您是否有任何理由希望直接在VM上使用CM约定和方法/道具来实现这一点?你能给我一些好处吗?我想这样做的原因是为了避免胖模特。
public class DetailViewModel:Screen
{
    public property string SomeText{get;set;}

    public void DoTheBoogie(){}
}