【发布时间】:2020-05-25 00:32:55
【问题描述】:
我正在实现一个 GridView,它通过单击列标题进行排序。我正在寻找一种标准解决方案,但它对我不起作用。
我有一个标题“P”,而单元格的内容和标题都应该居中(对齐)。标头具有与绑定“照片”不同的标签“P”。
<GridViewColumn Width="30" Header="P">
<GridViewColumn.HeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</GridViewColumn.HeaderContainerStyle>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Photo}" HorizontalAlignment="Center"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
处理列单击的代码如下(来自 Mircosoft 站点)。
假设存在 DisplayMemberBinding
var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
我没有,否则列标题和内容不居中。
否则将列的标签作为属性进行排序。
var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
这也不起作用,因为我的标签是“P”而属性是“照片”。
还有什么想法吗?
internal void HandleOverviewColumnHeaderClicked(GridViewColumnHeader headerClicked)
{
ListSortDirection direction;
if (headerClicked != null)
{
if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
{
if (headerClicked != _lastHeaderClicked)
{
direction = ListSortDirection.Ascending;
}
else
{
if (_lastDirection == ListSortDirection.Ascending)
{
direction = ListSortDirection.Descending;
}
else
{
direction = ListSortDirection.Ascending;
}
}
var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
Sort(sortBy, direction);
if (direction == ListSortDirection.Ascending)
{
headerClicked.Column.HeaderTemplate = _window.Resources["HeaderTemplateArrowUp"] as DataTemplate;
}
else
{
headerClicked.Column.HeaderTemplate = _window.Resources["HeaderTemplateArrowDown"] as DataTemplate;
}
// Remove arrow from previously sorted header
if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
{
_lastHeaderClicked.Column.HeaderTemplate = null;
}
_lastHeaderClicked = headerClicked;
_lastDirection = direction;
}
}
}
【问题讨论】:
标签: c# wpf sorting listview gridview