我的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));
}
答案 0 :(得分:1)
您可以做的是与PreviewMouseUp
事件挂钩,以便查看已提出的Source
的{{1}}属性。
除直接事件外,WPF成对定义了大多数路由事件 - 一个隧道和另一个冒泡。隧道事件名称始终以&#39;预览&#39;并且首先被提升。这使父母有机会在事件到达孩子之前看到事件。接下来是冒泡的对应物。在大多数情况下,您只会处理冒泡的。预览通常用于
阻止事件(e.Handled = true)导致父母做某事 进入正常的事件处理。
e.g。如果UI Tree = Button包含Grid包含Canvas包含Ellipse 点击椭圆会导致(MouseDownButton被Button吃掉而Click会被提升。)
Event