C# 如何从GridViewColumn标题获取单击事件?

C# 如何从GridViewColumn标题获取单击事件?,c#,wpf,C#,Wpf,我可以从标题下的所有内容中获取事件,但单击标题无法获取事件。这是XAML;请注意,该事件适用于整个ListView,因此在单击任何内容时都应激活该事件: <ListView x:Name="myListView" MouseLeftButtonUp="myListView_MouseLeftButtonUp" Margin="10"> <ListView.View> <GridView> <GridView

我可以从标题下的所有内容中获取事件,但单击标题无法获取事件。这是XAML;请注意,该事件适用于整个ListView,因此在单击任何内容时都应激活该事件:

<ListView x:Name="myListView" MouseLeftButtonUp="myListView_MouseLeftButtonUp" Margin="10">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="File Path"
                                DisplayMemberBinding="{Binding Path=Path}"  />
                <GridViewColumn Header="File Size"
                                DisplayMemberBinding="{Binding Path=Size}" />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
单击标题下的任何位置都能做出完美的响应:
“System.Windows.Controls.ListView项目数:0”

单击“文件路径”标题不会执行任何操作。单击“文件大小”标题不会执行任何操作

MSDN说:



Visual Studio说没有GridViewColumnHeader这样的东西,因此MSDN上的任何代码都不起作用。

默认情况下,WPF UI事件就是这样工作的。它们冒出泡沫。如果一路上有人吃了消息(按钮型控件就是这么做的),那么更高级别的控件就不会得到它。您可以使用事件的预览版本,也可以使用更简洁的方式:

AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(ListView_OnColumnClick));

应在ListView上调用AddHandler,如:

myListView.AddHandler(GridViewColumnHeader.ClickEvent,new RoutedEventHandler(myListView_OnColumnClick))


然后,e.OriginalSource可以强制转换到myListView列中的GridViewColumnHeader,单击可以识别您的列。

即使有点晚,但在XAML中,您可以执行以下操作:

<!-- ListView -->
<GridView AllowsColumnReorder="True">
    <GridViewColumn Width="220">
        <GridViewColumnHeader Content="{DynamicResource ResourceKey=explorer_column_name}" Command="{Binding Path=ISortBy}" CommandParameter="{x:Static enu:SortType.Name}"/>
        <GridViewColumn.CellTemplate>
            
            //...
            
        </GridViewColumn.CellTemplate>
    </GridViewColumn>
    //..
</GridView>

//...
//..

您的框架版本是什么?4.5,这是Visual Studio Express 2013的默认设置。您提到的示例似乎仅适用于.NET 4。这似乎是朝着正确方向迈出的一步,但我无法检测单击的标题

使用事件的预览版本时会显示以下内容:
“System.Windows.Controls.ListView Items.Count:0”

如果我试图将其强制为GridViewColumnHeader或GridViewColumn,程序将崩溃:
private void ListView_PreviewMouseLeftButtonUp(对象发送者,MouseButtonEventArgs e){string output=(发送方作为GridViewColumnHeader.ToString();MessageBox.Show(output);}崩溃:System.NullReferenceExceptionOnYour AddHandler事件将发送方.ToString()标识为“TestApplication.MainWindow”因此,我不确定如何从那里检查标题。尝试将其强制转换为GridViewColumnHeader或GridViewColumn会导致与System.NullReferenceException相同的崩溃类型。您可以在以下位置获取它:GridViewColumnHeader columnClicked=e.OriginalSource as GridViewColumnHeader;(使用AddHandler方法).有意思。我不知道除了发送者之外还有来源。谢谢!
AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(ListView_OnColumnClick));
<!-- ListView -->
<GridView AllowsColumnReorder="True">
    <GridViewColumn Width="220">
        <GridViewColumnHeader Content="{DynamicResource ResourceKey=explorer_column_name}" Command="{Binding Path=ISortBy}" CommandParameter="{x:Static enu:SortType.Name}"/>
        <GridViewColumn.CellTemplate>
            
            //...
            
        </GridViewColumn.CellTemplate>
    </GridViewColumn>
    //..
</GridView>