WPF GridViewColumnHeader.Click - Get ItemsSource - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть страница WPF, где у меня есть несколько ListViews.Я хочу отсортировать свои списки при нажатии на headers, для этого нет проблем, но сейчас я делаю отдельную функцию для каждого ListView, я хотел бы сделать общую функцию.

Допустим, яхотел бы заменить это:

contexte.ListeDesAssemblagesView.SortDescriptions.Clear();
contexte.ListeDesAssemblagesView.SortDescriptions.Add(monsort);

чем-то вроде:

sender.ItemsSource.SortDescriptions.Clear();
sender.ItemsSource.SortDescriptions.Add(monsort);

Редактировать: Вот код моей функции, измененный благодаря mm8.

void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
    ListSortDirection direction;
    ListView listView = sender as ListView;
    ICollectionView view = CollectionViewSource.GetDefaultView(listView.ItemsSource);

    string header = "";
    if (headerClicked.Column.DisplayMemberBinding != null)
    {
        header = ((System.Windows.Data.Binding)headerClicked.Column.DisplayMemberBinding).Path.Path;
    }
    else
    {
        try
        {
            DataTemplate cellTemplate = headerClicked.Column.CellTemplate;
            Grid grid = cellTemplate.LoadContent() as Grid;
            TextBlock textBlock = grid.Children.OfType<TextBlock>().FirstOrDefault();
            header = BindingOperations.GetBinding(textBlock, TextBlock.TextProperty).Path.Path;
        }
        catch
        {

        }
    }

    string lastHeaderName = view.SortDescriptions[0].PropertyName;
    string lastDirection = view.SortDescriptions[0].Direction.ToString();
    if (headerClicked != null)
    {
        if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
        {
            if (header != lastHeaderName)
            {
                direction = ListSortDirection.Ascending;
            }
            else
            {
                if (lastDirection == "Ascending")
                {
                    direction = ListSortDirection.Descending;
                }
                else
                {
                    direction = ListSortDirection.Ascending;
                }
            }
            if (header != "")
            {
                SortDescription monsort = new SortDescription(header, direction);
                view.SortDescriptions.Clear();
                view.SortDescriptions.Add(monsort);  
            }
        }
    }
}

1 Ответ

1 голос
/ 01 апреля 2019

Если вы подключите обработчик событий к ListViews в вашей разметке XAML следующим образом:

<ListView GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">

... вы можете просто привести аргумент sender:

void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
{
    ListView listView = sender as ListView;
    ICollectionView view = CollectionViewSource.GetDefaultView(listView.ItemsSource);
    //...
}
...