我尝试做的是当用户通过点击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
是过滤进程调用的最后一个方法?
答案 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}
的行