【问题标题】:Command class in Caliburn MicroCaliburn Micro 中的命令类
【发布时间】:2013-08-08 18:21:06
【问题描述】:

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

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

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

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

Repost 来自 Caliburn Micro 论坛,我没有得到任何答案,所以我在这里碰碰运气。

【问题讨论】:

  • 您能否更清楚地问清楚,您对什么感到困惑或需要更多信息?我不完全理解你的问题,尤其是最后一部分将“Execute”和“CanExecute”放在不同的对象中?
  • 听起来您想创建一个命令处理程序类型的对象,该对象将用作您的命令的绑定源。您是否有任何理由要直接在 VM 上使用 CM 约定和方法/道具来执行此操作?你能给出这方面的一些好处吗?
  • 我想要这样做的原因是为了避免胖 ViewModel。

标签: mvvm caliburn.micro


【解决方案1】:

您应该尽量避免使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 属性值更改时自动启用和禁用按钮.

【讨论】:

    【解决方案2】:

    要避免胖 ViewModel,您还需要避免胖 View。 Caliburn.Micro 允许您按照 Screens, Conductors and Composition 中的描述组合视图/视图模型。

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

    另一种选择是将 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。这导致更清洁和更模块化的设计

    【讨论】:

      猜你喜欢
      • 2016-01-20
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2012-01-29
      • 2012-10-24
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多