2011-01-10 3 views
0

GridViewの列見出し内にコントロールの埋め込みをテンプレートする方法が見つかりました。しかし、私はどのように項目をそれらを埋めるために私のコードを使用してコントロールを見つけるか分からない。私は組み込みコントロールから発生したイベントにどのように応答し、それがどの列にあるかを判断する方法を見つけました。そうでなければ、埋め込みComboBoxへの参照を取得する方法がわかりません。GridViewColumn HeaderTemplate内でコンボボックスにアクセスするにはどうすればよいですか?

あなたのアイデア与えるためにいくつかのコード:すべてのコンボボックスがいることを考え、データバインディングを使用してから選択する項目の同じリストを持っていた場合

 GridView grdView = new GridView(); 

     for (int column = 1; column <= context.data.GetLength(1); column++) 
     { 
      GridViewColumn gvc = new GridViewColumn(); 
      gvc.DisplayMemberBinding = new Binding(column.ToString()); 
      gvc.Header = column.ToString(); 
      gvc.Width = 120; 
      gvc.HeaderTemplate = (DataTemplate)this.Resources["ComboHeaderTemplate"]; 
      grdView.Columns.Add(gvc); 
     } 

     ListView1.View = grdView; 
     ListView1.ItemsSource = dt.DefaultView; 

<Page.Resources> 
    <DataTemplate x:Key="ComboHeaderTemplate"> 
     <DockPanel> 
      <ComboBox Name="columnHeading" /> 
     </DockPanel> 
    </DataTemplate> 
</Page.Resources> 

そして、コードビハインドでの各列に一意の値を選択できる限り、問題はありません。

答えて

1

ここで私は結局何をしましたか。

XAML:背後

<DataTemplate x:Key="ComboHeaderTemplate"> 
     <DockPanel> 
      <ComboBox Name="columnHeading" Loaded="columnHeadingLoaded" SelectionChanged="columnHeadingSelectedChanged" Width="Auto" /> 
     </DockPanel> 
    </DataTemplate> 

コード:

private void columnHeadingLoaded(object sender, RoutedEventArgs e) 
    { 
     ((ComboBox)sender).ItemsSource = myList; 
     ((ComboBox)sender).SelectedIndex = 0; 
    } 

    // My columns are named "1", "2" etc 
    private void columnHeadingSelectedChanged(object sender, SelectionChangedEventArgs e) 
    { 
     int columnIndex = int.Parse(((ComboBox)sender).DataContext.ToString()) - 1; 

     if (((ComboBox)sender).SelectedIndex == 0) 
     { 
      this.Headings[columnIndex] = null; 
     } 
     else 
     { 
      this.Headings[columnIndex] = ((ComboBox)sender).SelectedValue.ToString(); 
     } 
    } 

思想は、私はXAMLでデータバインディングを使用する必要がありますが、これは簡単でした。

1

あなたは、コンボボックスを取得するためにVisualTreeHelperを使用することができます。

GridViewColumn上のコンボボックスを見つけるために、ヘルパーメソッドを作成します。

public T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       return (T)child; 
      } 

      T childItem = FindVisualChild<T>(child); 
      if (childItem != null) return childItem; 
     } 
    } 
    return null; 
} 

その後、コンボボックスへの参照を取得するには次のようなことをしてください:

ComboBox cb = FindVisualChild<ComboBox>(gvc); 

これはあなたが探しているのですか?

+0

()私はのSystem.InvalidOperationExceptionがユーザーコード メッセージ= 'System.Windows.Controls.GridViewColumnによって未処理だっ取得していますです'はVisualまたはVisual3Dではありません。 PageFunctionクラスを使用していますが、違いがある場合はルートのウィンドウではありません。 –

0

あなたはこれを試すことができます。

var cbx= gvc.HeaderTemplate.LoadContent() as ComboBox; 

gvcがVisualTreeHelper.GetChildrenCountでGridViewColumn

関連する問題