将SelectedItem集中在ColumnSort WPF上

本文关键字:WPF ColumnSort SelectedItem 集中 | 更新日期: 2023-09-27 18:26:34

当用户通过单击DataGrid顶部的标题对列进行排序时,我要做的是保持DataGrid.SelectedItem的焦点。目前,我正在点击DataGrid列标题调用自己的方法;

    private void headerClick(object sender, RoutedEventArgs e)
    {
        var selectedCompany = dataGrid.SelectedItem as CompanyModel;
        var columnHeader = sender as DataGridColumnHeader;
        if (columnHeader != null)
        {
            SetSelectedCompany(Convert.ToInt32(selectedCompany.CompanyID));
        }
    }

这调用SetSelectedCompany

    private void SetSelectedCompany(int companyID)
    {
        try
        {
            foreach (var item in dataGrid.Items.OfType<CompanyModel>())
            {
                if (item.CompanyID == companyID.ToString())// suppose iterRow.Row.ItemArray[0] is ID column in yourDataGrid
                {
                    dataGrid.SelectedItem = item;
                    dataGrid.ScrollIntoView(dataGrid.SelectedItem);
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            var hEs = new HandleExceptionService();
            hEs.HandleException(ex.ToString());
        }
    }

当我在UI的其他地方调用它时,这个方法确实有效,但当单击DataGrid列标题时,它不起作用。这是因为调用了SetSelectedCompany方法,然后过滤了DataGrid吗?如果SetSelectedCompany是筛选过程中调用的最后一个方法,我该如何绕过它?

将SelectedItem集中在ColumnSort WPF上

我认为没有一种简单的方法可以在保持用户选择的行的焦点的同时对数据绑定行进行排序,但如果你能提供更多关于排序后为什么需要焦点的信息(这不是传统的UI行为),那么我们也许可以找到一种不同的方法来剥猫皮。

尝试将用户选择的行绑定到实际数据,如记录ID或其他数据。然后在您的排序方法上,将焦点设置为ID={binded value}的行

DataGrid 中的WPF绑定SelectedItem

尝试处理ColumnHeader click。ColumnHeader只是一个Button:

XAML:

<DataGrid Name="dataGrid">
   <DataGrid.Resources>
      <Style TargetType="DataGridColumnHeader">
         <EventSetter Event="Click" Handler="columnHeader_Click" />
      </Style>
   </DataGrid.Resources>
</DataGrid>
private void columnHeader_Click(object sender, RoutedEventArgs e)
{
   var columnHeader = sender as DataGridColumnHeader;
   if (columnHeader != null)
   {
      SetSelectedCompany(11);     
   }
}