GridViewColumnHeader ClickイベントでのListViewControlの取得方法

私は7種類のListViewを持っています。

SortClick(object sender、RoutedEventArgs e)というSortmethodがあります。 GridViewColumnHeaderをクリックすると、SortClickイベントが発生します。

しかし、この方法では、どのListViewをソートする必要があるのか​​を伝える必要があります。

listview2.SortNow();

今私の質問は、GridViewColumnHeader(送信者)または多分 e からControl(ListView)を取得する方法は可能ですか?

ListView XAMLの外観は次のとおりです。


                    
                        
                    
                    
                        
                            
                                
                               
                            
                                
                            
                        
                    
                

ここにSortClickコードがあります:

        /// 
        /// Sortiert (Ascending/Descending)
        /// 
        /// sender
        /// e
        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

2 答え

私はあなたがSortClickイベントと言ったときの意味をはっきりとは分かりませんが、あなたの SortClick ハンドラが添付された GridViewColumnHeader.Click イベントを意味すると思います。

次のように GridViewColumnHeader.Click をListViewに追加すると、


イベントハンドラの送信者引数に ListView コントロールを、 e.OriginalSource には GridViewColumnHeader

明確にするために編集します。あなたの SortClick ハンドラでは、次のようなコントロールにアクセスします:

ListView listView = sender as ListView;
GridViewColumnHeader header = e.OriginalSource as GridViewColumnHeader;
4
追加された
はい、しかし、私はどのように送信者引数からListViewコントロールを取得しますか?
追加された 著者 eMi,
listView null です
追加された 著者 eMi,
ちょうどそうだった....
追加された 著者 eMi,
はい、今listViewはnullではありませんが、GridViewColumnHeaderとして sender を使用することはできません。コードを投稿しました。
追加された 著者 eMi,
ああ、ありがとう:)
追加された 著者 eMi,
ListView listView = ListViewとしての送信者
追加された 著者 Clemens,
クリックハンドラを添付するListViewのXAMLを投稿してください。
追加された 著者 Clemens,
GridViewColumnHeader ではなく、 ListView SortClick ハンドラを私の答えに示すように)に追加してください。
追加された 著者 Clemens,
私の答えを読んで、 e.OriginalSource から GridViewColumnHeader を取得します。
追加された 著者 Clemens,
GridViewColumnHeader.Clickは事実上ButtonBase.Clickです。つまり、リストビュー内のどのボタンベースのコントロールでも、このイベントがトリガされます。トグルボタンまたはチェックボックスをクリックしてください。
追加された 著者 Ahmad,

私はClemensのソリューションと一緒に行くだろうが、それがあなたのためのオプションでなければ、ビジュアルツリーを歩いてListViewを見つけることもできる:

    static T FindAncestor(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(columnHeader);
2
追加された
あなたのソリューションのためのthxが、私のために複雑なthats:+これはとにかくやって1
追加された 著者 eMi,