2012-02-06 3 views
2

私は7種類のListViewを持っています。GridViewColumnHeader ClickイベントでのListViewControlの取得方法

GridViewColumnHeaderをクリックすると、SortClick(object sender, RoutedEventArgs e) - と呼ばれるソート方法があり、SortClickイベントが発生します。

しかし、ソートされなければならないListViewの私が言う必要があり、この方法では、可能

listview2.SortNow(); 

私の質問ですが、私は多分GridViewColumnHeader(sender)またはeからコントロール(リストビュー)を取得する方法、それも可能ですか?ここで

<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)); 
     } 

答えて

4

は、私はあなたがSortClickイベントを言うとき、あなたが何を意味するかはかなりわからないんだけど、私はあなたを推測ListViewのXAMLは、どのように見えるか

SortClickハンドラを添付したGridViewColumnHeader.Clickイベントを意味します。

あなたはこのようなリストビューにGridViewColumnHeader.Clickを追加する場合:

<ListView GridViewColumnHeader.Click="SortClick"> 

あなたのイベントハンドラ、およびe.OriginalSourceGridViewColumnHeadersender引数にListViewコントロールを取得します。

明瞭にするために編集します。私はクレメンスのソリューションとなるだろうが、それはあなたのためのオプションではない場合、あなたはまた、リストビューを見つけるために、ビジュアルツリーを歩くことができる

ListView listView = sender as ListView; 
GridViewColumnHeader header = e.OriginalSource as GridViewColumnHeader; 
+0

はい、どのように送信者引数からListViewコントロールを取得できますか? – eMi

+0

By ListView ListView = ListViewとしての送信者; – Clemens

+0

が動作していない、 'listView'が' null'です – eMi

2

:あなたのSortClickハンドラでは、このようにコントロールにアクセスします:

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); 
+0

あなたのソリューションのためのthxが、私にとっては複雑なthats:+これはとにかく – eMi

関連する問題