3

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

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

据我了解,您必须将“Execute”方法和“CanExecute”属性直接放在视图模型中,命名为与视图中的控件匹配,以使魔法发挥作用。

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

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

4

2 回答 2

3

你应该尽量避免使得墨忒耳法则失效。因此,在您的视图模型上,您可以有一个执行方法和一个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的视图上有a ,那么当单击按钮时x:Name="Save",Caliburn.Micro 将在视图模型上自动调用您的动词,并在属性值更改时自动启用和禁用按钮。SaveCanSave

于 2013-08-07T13:27:02.273 回答
2

为了避免胖 ViewModel,你还需要避免胖 View。Caliburn.Micro 允许您按照 Screens 、Conductors 和 Composition中的描述组合 Views/ViewModels 。

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

另一种选择是将 MasterView 元素绑定到 DetailViewModel 属性或操作,方法是将详细信息的属性添加到目标名称之前。我还找不到具体的网址,所以例子是凭记忆的。

假设您有以下课程:

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。

我更喜欢创建一个单独的视图,命名为 DetailView 并在 MasterView 中添加一个名为“MyDetails”的 ContentControl。这导致更清洁和更模块化的设计

于 2013-08-08T14:56:43.343 回答