你如何使用Caliburn.Micro绑定命令属性?

3
我有一个行为,其中包含多个命令属性。通常我使用MVVM Light,在我的视图模型中使用路由命令并绑定到这些命令。然而,这个项目使用Caliburn.Micro,所以我正在尝试按照Caliburn.Micro的方式进行操作。在Message.Attach上是否有一些语法可以做到这一点(有关Message.Attach解析器的文档是否有用)?
我是否需要修改行为以公开事件,以使其与Caliburn.Micro兼容?

使用协程实现该行为。 - Derek Beattie
3个回答

4

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


这里是devdigital提到的Actions链接:http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions - EtherDragon
好的,你的第一句话让我有些困惑,我以为你正在将代码移植到Caliburn.Micro中。如果是这样的话,只需阅读“Actions”文章,你会发现大部分工作都可以通过约定来完成。例如,将一个按钮命名为“发送”,当点击它时,它将调用你的视图模型中的“发送”方法。 - devdigital
我正在尝试使用来自另一个项目的行为。我希望以Caliburn Micro的方式使用相同的行为,但显然根本不使用命令。因此,我将该行为重写为触发器,因为这样更容易。 - Bryant

3
Caliburn.Micro可以处理路由操作,只要你正确地设置了视图和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源代码中可用的HelloEventAggrgator代码示例,以获得一个例子... 但基本的jist是这样的:
您可以为聚合器制作自定义事件。
public YourEvent
{
...
}

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

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

通过添加 IHandle,您的 ViewModels 将被设置为处理这些事件。

[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不关心事件是如何触发的,只关心它是否被触发,并且它是从聚合器处理该事件的权威。

1
我不确定这与我所提出的问题有任何关系。我正在尝试绑定行为的命令属性。我没有任何事件,也不会创建一个自定义事件来处理这个问题。 - Bryant
1
好的,你的问题中有一部分是询问如何使用“Caliburn.Micro方式”来完成,所以我提供了这个答案。很抱歉你没有觉得它有用。 - EtherDragon
嘿,EtherDragon。我喜欢使用事件聚合器的想法,但是你回复中的代码让我有点困惑。在Button_Clicked处理程序中,你有“this.Events.Publish(new YourEvent());”。我的问题是,你如何让视图的代码后台知道事件聚合器? - Kerby

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

4
如果您有机会的话,能否在此答案中发布一些示例代码,以便我们在项目中参考它? - EtherDragon
我认为这里没有什么可以分享的。我使用了触发器而不是行为。 - Bryant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接