【问题标题】:How do you bind to a command property with caliburn.micro?如何使用 caliburn.micro 绑定到命令属性?
【发布时间】:2011-10-04 13:57:11
【问题描述】:

我的行为暴露了几个命令属性。通常我使用 MVVM Light 并且只会在我的视图模型中使用路由命令并绑定到这些命令。但是,这个项目使用的是 Caliburn.Micro,所以我正在尝试使用 Caliburn.Micro 的方式。是否有一些我可以在 Message.Attach 上使用的语法来执行此操作(Message.Attach 的解析器是否有任何好的文档)?

我是否必须修改行为以公开事件才能使其与 Caliburn.Micro 一起使用?

【问题讨论】:

  • 使用协程实现行为。

标签: silverlight-4.0 mvvm caliburn.micro


【解决方案1】:

Caliburn.Micro 有自己的视图/视图模型通信机制,可以替代称为Actions 的命令。您应该能够将 Action 参数设置为现有命令的 Execute 委托,并在需要时设置适当的视图控件属性(例如 IsEnabled)以绑定到您的 CanExecute 委托。

【讨论】:

  • 这里是 devdigital 提到的 Actions 的链接,caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions
  • 好吧,你的第一句话让我很困惑,我以为你是在将代码移植到 Caliburn.Micro。在这种情况下,只需阅读 Actions 文章,您就会发现大部分工作都是通过约定为您完成的。即调用一个按钮“发送”,然后单击视图模型上的发送方法将被调用。
  • 我正在尝试使用来自另一个项目的行为。我希望使用相同的行为,但使用 Caliburn Micro 方式,显然根本不使用命令。所以我将行为重写为触发器,因为这样更容易。
【解决方案2】:

Caliburn.Micro 为您处理路由 Actions,只要您正确设置 View 和 ViewModel(它使用一些隐含的假设,这可能是也可能不是您的一杯茶)这是关于 Actions 的链接:http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation

做同样事情的更好、更不紧密耦合的方法是使用事件聚合器 - http://caliburnmicro.codeplex.com/wikipage?title=The%20Event%20Aggregator&referringTitle=Documentation

以 Caliburn.Micro 源代码中提供的 HelloEventAgrgator 代码示例为例...但基本要点是这样的:

您制作自定义事件以供聚合器使用。

public YourEvent
{
...
}

您的视图将发布这些自定义事件 - 它不关心谁在听,只关心事件被发布。

public YourCodeBehind
{
    public Button_Clicked(...)
    {
        this.Events.Publish(new YourEvent());
        ...
    }
    ....
}

您的 ViewModel 将设置为通过添加 IHandle 来处理这些事件

[Export(typeof(...))]    
public class YourViewModel : IShell, IHandle<YourEvent>
{
    [ImportingConstructor]
    public YourViewModel(IEventAggregator events)
    {
        events.Subscribe(this);
        ...
    }
    public Handle(YourEvent event)
    {
        ...
    }
    ...
{

此方法通过允许视图真正只处理绑定到数据和发布事件来保持非常高的 SoC - 视图仍然不关心事件的处理方式。

然后通过添加 IHandle 接口设置每个视图模型以处理事件。 (请注意,您可以在单个 ViewModel 上拥有许多不同的 IHandle 接口)ViewModel 不关心事件是如何引发的,只关心它是如何引发的,并且它是从聚合器处理该事件的权限。

【讨论】:

  • 我完全不确定这与我提出的问题有何关系。我正在尝试在行为上绑定命令属性。我没有任何事件,也不会制作自定义事件来处理这个问题。
  • 嗯,您的部分任务询问如何使用“Caliburn.Micro 方式”来实现,这就是我提供的答案。抱歉,您没有发现它有用。
  • 嘿以太龙。我喜欢使用事件聚合器的想法,但我对您回复中的代码有点困惑。在 Button_Clicked 处理程序中,您有“this.Events.Publish(new YourEvent());”。我的问题是如何让视图的代码隐藏以了解事件聚合器?
【解决方案3】:

我最终将行为重写为触发器来处理这个问题。

【讨论】:

  • 如果有机会,能否在此答案中发布一些示例代码,以便我们在项目中参考?
  • 我认为这里没有什么可以分享的。我没有使用行为,而是使用了触发器。
猜你喜欢
  • 2011-05-26
  • 2011-04-08
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多