Как я могу получить, ListViewControl на GridViewColumnHeader Click Event - PullRequest
2 голосов
/ 06 февраля 2012

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

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

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

listview2.SortNow();

Теперь мой вопрос: как я могу получить Control (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));
        }

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Я не совсем уверен, что вы имеете в виду, когда говорите SortClick Event, но, думаю, вы имеете в виду событие 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;
2 голосов
/ 06 февраля 2012

Я бы пошел с решением Клеменса, но если это не вариант для вас, вы также можете пройти по визуальному дереву, чтобы найти 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);
...