我正在寻找一个良好的(阅读:简单)就如何落实与棱镜事件聚合的例子。 我从来没有使用棱镜和我也很新的MVVM本身。
我有一个WPF画布视图,我想处理的视图模型画布上的MouseUp事件。 现在,是我们组织的权力要我用棱镜,显然棱镜建议使用事件聚合,这就是为什么我需要让我开始一个样本。
我正在寻找一个良好的(阅读:简单)就如何落实与棱镜事件聚合的例子。 我从来没有使用棱镜和我也很新的MVVM本身。
我有一个WPF画布视图,我想处理的视图模型画布上的MouseUp事件。 现在,是我们组织的权力要我用棱镜,显然棱镜建议使用事件聚合,这就是为什么我需要让我开始一个样本。
所有你需要的是从MVVMLight或System.Windows.Interactivity(混合SDK)的EventToCommand行为。 我建议你采取MVVMLight版本,因为它有一些有用的特价:)
<Canvas>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseUp" >
<i:InvokeCommandAction Command="{Binding YourMouseUpViewModelCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Canvas>
EventAggregator从棱镜我主要用于分离视图模型视图模型来沟通。
我不知道PRISM的EventAggregator允许的事件 - >命令绑定。
在这种情况下,你的另一个选择是使用“行为”。 这里有一个体面的概述行为: http://wpftutorial.net/Behaviors.html 。 您可以忽略本教程的混合部分; 重要的是,你必须安装至少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);
}
}
}
你可以依赖的另一个属性添加到行为绑定命令参数,以便您可以执行与该参数的命令; 我只是在我的例子中使用空。
而我的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>
使用行为更通用的方法,提出了在AttachedCommandBehavior V2又名ACB它甚至还支持多种事件到命令绑定,
下面是使用一个非常简单的例子:
<Border local:CommandBehavior.Event="MouseDown"
local:CommandBehavior.Command="{Binding DoSomething}"
local:CommandBehavior.CommandParameter="From the DarkSalmon Border"
/>