я бы попробовал следующий подход:
A) вам нужно иметь вид сетки отображения списка - я думаю, что вы уже сделали
Б) определить стиль для GridViewColumnHeader:
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="gridViewColumnStyle">
<EventSetter Event="Click" Handler="OnHeaderClicked"/>
<EventSetter Event="Loaded" Handler="OnHeaderLoaded"/>
</Style>
в моем случае у меня была установлена целая куча других свойств, но в базовом сценарии вам понадобится событие Loaded. Нажатие - это полезно, если вы хотите добавить функции сортировки и фильтрации.
C) в вашем коде списка, свяжите шаблон с вашим gridview:
public MyListView()
{
InitializeComponent();
GridView gridViewHeader = this.listView.View as GridView;
System.Diagnostics.Debug.Assert(gridViewHeader != null, "Expected ListView.View should be GridView");
if (null != gridViewHeader)
{
gridViewHeader.ColumnHeaderContainerStyle = (Style)this.FindResource("gridViewColumnStyle");
}
}
D) затем в вашем обработчике OnHeaderLoaded вы можете установить правильный шаблон на основе данных столбца
void OnHeaderLoaded(object sender, RoutedEventArgs e)
{
GridViewColumnHeader header = (GridViewColumnHeader)sender;
GridViewColumn column = header.Column;
// выберите и примените ваш шаблон данных здесь.
e.Handled = true;
}
E) Полагаю, вам также необходимо приобрести право собственности на свойство зависимостей ItemsSource и обработать его измененное событие.
ListView.ItemsSourceProperty.AddOwner(typeof(MyListView), new PropertyMetadata(OnItemsSourceChanged));
static void OnItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
MyListView view = (MyListView)sender;
//do reflection to get column names and types
//and for each column, add it to your grid view:
GridViewColumn column = new GridViewColumn();
//set column properties here...
view.Columns.Add(column);
}
сам класс GridViewColumn не имеет много свойств, поэтому вы можете добавить туда некоторую информацию, используя присоединенные свойства - то есть, например, уникальный тег столбца - заголовок, скорее всего, будет использоваться для локализации, и вы не будете ретранслировать его ,
В целом, этот подход, хотя и довольно сложный, позволит вам легко расширить функциональность представления списка.