WPF - DataGrid上的上下文菜单

时间:2014-04-07 19:33:31

标签: c# wpf datagrid contextmenu

我的DataGrid绑定到数据源,这是一个数据库。当用户右键单击DataGrid控件上的某个位置时,我希望能够识别他或她执行了哪一列。场景如下 - 如果在持有日期的列上打开ContextMenu,那么(例如)我想向他提供过滤掉小于,大于或等于所选日期的日期的选项。

<DataGrid.Resources>
        <Helpers:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>

<DataGrid.ContextMenu>
        <ContextMenu DataContext="{Binding Path=DataContext}">
            <MenuItem Header="Cokolwiek" Command="{Binding Source={StaticResource proxy}, Path=Data.FK}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent.PlacementTarget.DataContext}"/>
        </ContextMenu>
</DataGrid.ContextMenu>

PlacementTarget是对DataGrid的引用,我希望它是对DataGridColumn的引用。

BindingProxy类:

public class BindingProxy : Freezable {
    protected override Freezable CreateInstanceCore() {
        return new BindingProxy();
    }

    public object Data {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.
    // This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object),
        typeof(BindingProxy), new UIPropertyMetadata(null));
}

1 个答案:

答案 0 :(得分:1)

您可以做的是与PreviewMouseUp事件挂钩,以便查看已提出的Source的{​​{1}}属性。

  

除直接事件外,WPF成对定义了大多数路由事件 - 一个隧道和另一个冒泡。隧道事件名称始终以&#39;预览&#39;并且首先被提升。这使父母有机会在事件到达孩子之前看到事件。接下来是冒泡的对应物。在大多数情况下,您只会处理冒泡的。预览通常用于

     

阻止事件(e.Handled = true)导致父母做某事   进入正常的事件处理。

e.g。如果UI Tree = Button包含Grid包含Canvas包含Ellipse 点击椭圆会导致(MouseDownButton被Button吃掉而Click会被提升。)

Event