Как я могу получить ListViewControl в событии GridViewColumnHeader Click

У меня есть 7 разных ListViews.

Существует метод сортировки под названием SortClick(object sender, RoutedEventArgs e) — при нажатии на GridViewColumnHeader возникает событие SortClick.

Но в этом методе я должен сказать, какой ListView должен быть отсортирован, т.е.

listview2.SortNow();

Теперь мой вопрос: как я могу получить элемент управления (ListView) из GridViewColumnHeader (sender) или, может быть, e, это вообще возможно?

Как выглядит ListView XAML:

<ListView ItemsSource="{Binding MissingTables}" Name="missingTablesListView" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="0" MinHeight="540" HorizontalContentAlignment="Stretch">
                    <ListView.Background>
                        <ImageBrush />
                    </ListView.Background>
                    <ListView.View>
                        <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding TableName}" Width="Auto">
                                <GridViewColumnHeader Click="SortClick" Content="TableName" Tag="TableName" ToolTip="Sortieren" />
                            </GridViewColumn>   
                            <GridViewColumn DisplayMemberBinding="{Binding Beschreibung}" Width="Auto">
                                <GridViewColumnHeader Click="SortClick" Content="Description" Tag="Beschreibung" ToolTip="Sortieren" />
                            </GridViewColumn>
                        </GridView>
                    </ListView.View>
                </ListView>

Вот код SortClick:

        /// <summary>
        /// Sortiert (Ascending/Descending)
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void SortClick(object sender, RoutedEventArgs e)
        {       
            //ListView listView = sender as ListView;

            GridViewColumnHeader column = sender as GridViewColumnHeader;
            String field = column.Tag as String;

            if (currentSortColumn != null)
            {
                AdornerLayer.GetAdornerLayer(currentSortColumn).Remove(sorter);
                listView.Items.SortDescriptions.Clear();
            }

            ListSortDirection newDir = ListSortDirection.Ascending;
            if (currentSortColumn == column && sorter.Direction == newDir)
            {
                newDir = ListSortDirection.Descending;
            }

            currentSortColumn = column;
            sorter = new Sorter(currentSortColumn, newDir);
            AdornerLayer.GetAdornerLayer(currentSortColumn).Add(sorter);
            listView.Items.SortDescriptions.Add(new SortDescription(field, newDir));
        }

person eMi    schedule 06.02.2012    source источник


Ответы (2)


Я не совсем уверен, что вы имеете в виду, когда говорите о событии SortClick, но я думаю, вы имеете в виду событие GridViewColumnHeader.Click с прикрепленным обработчиком SortClick.

Если вы добавите GridViewColumnHeader.Click в ListViews следующим образом:

<ListView GridViewColumnHeader.Click="SortClick">

вы получите элемент управления ListView в аргументе sender вашего обработчика событий и GridViewColumnHeader в e.OriginalSource.

РЕДАКТИРОВАТЬ для ясности. В вашем обработчике SortClick вы получите доступ к элементу управления следующим образом:

ListView listView = sender as ListView;
GridViewColumnHeader header = e.OriginalSource as GridViewColumnHeader;
person Clemens    schedule 06.02.2012
comment
да, но как мне получить элемент управления ListView из аргумента отправителя? - person eMi; 06.02.2012
comment
Не могли бы вы опубликовать XAML (одного из) ваших ListView, где вы прикрепляете обработчик кликов? - person Clemens; 06.02.2012
comment
Добавьте обработчик SortClick к ListView (как показано в моем ответе), а не к GridViewColumnHeader. - person Clemens; 06.02.2012
comment
да, теперь listView не нулевой, но теперь я не могу использовать sender as GridViewColumnHeader , я разместил свой код - person eMi; 06.02.2012
comment
Прочтите мой ответ, вы получите GridViewColumnHeader от e.OriginalSource. - person Clemens; 06.02.2012
comment
Обратите внимание, что GridViewColumnHeader.Click фактически является ButtonBase.Click. То есть любые элементы управления на основе кнопок в представлении списка вызовут это событие, например. нажав кнопку-переключатель или флажок. - person Ahmad; 16.07.2015

Я бы выбрал решение Клеменса, но если это не вариант для вас, вы также можете подняться по визуальному дереву, чтобы найти ListView:

    static T FindAncestor<T>(DependencyObject obj) where T : DependencyObject
    {
        var tmp = VisualTreeHelper.GetParent(obj);
        while (tmp != null && !(tmp is T))
        {
            tmp = VisualTreeHelper.GetParent(tmp);
        }
        return (T)tmp;
    }

    ...

    var listView = FindAncestor<ListView>(columnHeader);
person Thomas Levesque    schedule 06.02.2012
comment
спасибо за ваше решение, но для меня это сложно :) + 1 за это в любом случае - person eMi; 06.02.2012