将SelectedItem保留在ColumnSort WPF上

时间:2015-12-11 11:24:14

标签: c# wpf datagrid

我尝试做的是当用户通过点击DataGrid.SelectedItem顶部的标题对列进行排序时,保持DataGrid的焦点。目前,我在点击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是过滤进程调用的最后一个方法?

2 个答案:

答案 0 :(得分:0)

尝试处理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);     
   }
}

答案 1 :(得分:0)

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

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

的行

WPF Binding SelectedItem in DataGrid