如何在DataGrid列标题上捕获"Click"事件

Bre*_*yan 9 .net wpf .net-4.0

似乎DataGrid.NET 4附带的内容不包含列和行标题点击的事件.我想接收列标题点击的事件,因为我想提供自己的排序行为并关闭默认排序,这是因为我的视图模型是一个分页模型,一次只显示25/50/100行,默认排序当然只对当前页面进行排序.

现在我可以创建一个DataGridColumnHeader包含可点击元素和设置的新样式ColumnHeaderStyle,虽然这看起来很痛苦,因为我很难搞清楚哪些列被点击等等.

还有其他人反对这个并解决了吗?

Jef*_*ado 28

标题只是按钮.与任何按钮一样,您可以注册该Click事件以捕获这些点击.只需设置样式定位DataGridColumnHeader并添加Click事件处理程序即可.然后在处理程序中,您可以通过直接访问标题sender.然后,您可以获得Column与该标头相关联的信息以及与之关联的其他信息.

<DataGrid>
    <DataGrid.Resources>
        <Style TargetType="DataGridColumnHeader">
            <EventSetter Event="Click" Handler="columnHeader_Click" />
        </Style>
    </DataGrid.Resources>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

然后在代码中:

private void columnHeader_Click(object sender, RoutedEventArgs e)
{
    var columnHeader = sender as DataGridColumnHeader;
    if (columnHeader != null)
    {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

进一步观察DataGrid,我注意到有一处ColumnHeaderStyle房产.我认为通过这个属性应用样式会更好.

<DataGrid>
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <EventSetter Event="Click" Handler="columnHeader_Click" />
        </Style>
    </DataGrid.ColumnHeaderStyle>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢杰夫,抱歉含糊不清。我想要做的是提供我自己的排序逻辑,在您的帮助下我现在已经实现了这一点,但是我当然必须将`CanUserSortColumns`设置为`False`,否则控件将尝试执行排序错误,但是当将光标移动到列标题上时,我想要很好的“悬停”效果,并希望“向上/向下”箭头指示排序方向(尽管后者不太重要)。非常感激你的帮助。 (2认同)