将事件绑定到Item ViewModel

时间:2014-05-15 09:51:11

标签: c# wpf mvvm

我有一个ListView / GridView设置,我想处理对已显示项目的右键单击。是否存在数据绑定方式?我见过像handling the super-elements event and poking around to find its origin这样复杂的解决方法,但是对于这样的基本请求感觉非常臃肿。

我喜欢看到的是将事件绑定到项目的ViewModel的动作 - 有没有办法做到这一点?与this类似,但我无法完全理解如何使其适用于单个ListView项目(我甚至不确定是否可能,tbh)。

粗略轮廓:

<ListView>
    <ListView.View>
        <GridView />
    </ListView.View>
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
        </Style>
    </ListView.Resources>
</ListView/>

2 个答案:

答案 0 :(得分:1)

有一种方法可以使用Blend SDK的Interactivity组件。它将提供EventTrigger,它在引发事件时执行命令。

<!--
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
-->

<Button Content="Click me">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <i:InvokeCommandAction Command="{Binding ClickCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

修改

您的问题的可能解决方案可能如下所示:

查看:

<ListView x:Name="listView">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseRightButtonUp">
            <i:InvokeCommandAction Command="{Binding RightClickOnItemCommand}"
                                   CommandParameter={Binding SelectedItem, ElementName=listView} />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListView>

视图模型:

public ICommand RightClickOnItemCommand { get; set; }

public void RightClickOnItem(object item)
{
}

答案 1 :(得分:1)

您可以尝试为列表视图项创建样式模板,并为其添加附加行为以处理鼠标点击。

public static readonly DependencyProperty PreviewMouseLeftButtonDownCommandProperty =
        DependencyProperty.RegisterAttached("PreviewMouseLeftButtonDownCommand", typeof (ICommand),
            typeof (MouseBehaviour), new FrameworkPropertyMetadata(PreviewMouseLeftButtonDownCommandChanged));

    private static void PreviewMouseLeftButtonDownCommandChanged(DependencyObject dependencyObject,
        DependencyPropertyChangedEventArgs args)
    {
        var element = (FrameworkElement) dependencyObject;
        element.PreviewMouseLeftButtonDown += Element_PreviewMouseLeftButtonDown;
    }

    private static void Element_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs args)
    {
        var element = (FrameworkElement) sender;
        ICommand command = GetPreviewMouseLeftButtonDownCommand(element);
        if (command != null)
        {
            command.Execute(args);
        }
    }

    public static void SetPreviewMouseLeftButtonDownCommand(UIElement element, ICommand value)
    {
        element.SetValue(PreviewMouseLeftButtonDownCommandProperty, value);
    }

    public static ICommand GetPreviewMouseLeftButtonDownCommand(UIElement element)
    {
        return (ICommand) element.GetValue(PreviewMouseLeftButtonDownCommandProperty);
    }