MVVM View事件Viewmodel命令绑定

时间:2012-06-14 09:39:07

标签: mvvm prism viewmodel commandbinding

我正在寻找一个关于如何使用Prism实现事件聚合器的好(阅读:简单)示例。我从未使用过Prism,而且我对MVVM本身也很陌生。

我有一个WPF画布作为View,我想在Viewmodel的画布上处理MouseUp事件。现在我们组织的权力要我使用Prism,显然Prism建议使用事件聚合器,这就是为什么我需要一个样本来让我开始。

3 个答案:

答案 0 :(得分:4)

您需要的只是来自MVVMLight或System.Windows.Interactivity(Blend SDK)的EventToCommand行为。我建议你采用MVVMLight版本,因为它有一些有用的特价:)

<Canvas>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseUp" >
        <i:InvokeCommandAction Command="{Binding YourMouseUpViewModelCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
</Canvas>
来自Prism的EventAggregator我主要用于将Viewmodel解耦为Viewmodel通信。

答案 1 :(得分:1)

我不知道PRISM的EventAggregator允许使用event-&gt;命令绑定。

在这种情况下,您的另一个选择是使用“行为”。这是一个体面的概述行为:http://wpftutorial.net/Behaviors.html。您可以忽略教程的Blend部分;重要的是你至少安装了Blend 3 SDK。我是这样做的:

public class ButtonDoubleClickCommandBehavior : Behavior<Button>
{
    public ICommand DoubleClickCommand
    {
        get { return (ICommand)GetValue(DoubleClickCommandProperty); }
        set { SetValue(DoubleClickCommandProperty, value); }
    }

    public static readonly DependencyProperty DoubleClickCommandProperty =
        DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(ButtonDoubleClickCommandBehavior));

    protected override void OnAttached()
    {
        this.AssociatedObject.MouseDoubleClick += AssociatedObject_MouseDoubleClick;
    }

    protected override void OnDetaching()
    {
        if (this.AssociatedObject != null)
        {
            this.AssociatedObject.MouseDoubleClick -= AssociatedObject_MouseDoubleClick;
        }
    }

    void AssociatedObject_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (DoubleClickCommand != null && DoubleClickCommand.CanExecute(null))
        {
            DoubleClickCommand.Execute(null);
        }
    }
}

您可以将另一个依赖项属性添加到绑定命令参数的行为,以便您可以使用该参数执行该命令;我在我的例子中使用了null。

我的XAML:

<Button Content="{Binding Path=Description}" VerticalAlignment="Center" HorizontalAlignment="Stretch" Template="{StaticResource TextBlockButtonTemplate}" Style="{StaticResource ZynCommandButton}" Tag="DescriptionButton">
    <e:Interaction.Behaviors>
        <ZViewModels:ButtonDoubleClickCommandBehavior DoubleClickCommand="{Binding Path=ItemDescriptionCommand}"/>
    </e:Interaction.Behaviors>
</Button>

答案 2 :(得分:0)

AttachedCommandBehavior V2 aka ACB提出了一种使用行为的更通用的方法,它甚至支持多个事件到命令的绑定,

这是一个非常基本的使用示例:

<Border local:CommandBehavior.Event="MouseDown"  
        local:CommandBehavior.Command="{Binding DoSomething}"
        local:CommandBehavior.CommandParameter="From the DarkSalmon Border"
/>