2013-09-11 3 views
2

У меня есть этот XAML кодПолучите значение заголовка GridViewColumn из ListView?

<ListView Name="_lvContacts" ItemsSource="{Binding AccountPhonesList}" 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="{Binding Path=ColumnHeader1}" DisplayMemberBinding="{Binding Path=Home}" Width="70" /> 
         <GridViewColumn Header="{Binding Path=ColumnHeader2}" DisplayMemberBinding="{Binding Path=Office}" Width="70" /> 
         <GridViewColumn Header="{Binding Path=ColumnHeader3}" DisplayMemberBinding="{Binding Path=Mobile}" Width="70" /> 
         <GridViewColumn Header="{Binding Path=ColumnHeader4}" DisplayMemberBinding="{Binding Path=Other}" Width="70" /> 
         <GridViewColumn Header="{Binding Path=ColumnHeader5}" DisplayMemberBinding="{Binding Path=Email}" Width="70" /> 
        </GridView> 
       </ListView.View> 
      </ListView> 

И это код за

  for (int i = 0; i < _lvContacts.Items.Count; i++) 
      { 
       string header = _lvContacts.Items[i].ToString(); 
       MyFunction(header); 
      } 

Как я могу получить GridViewColumn заголовок из ListView? Я пытался получить GridView из ItemSources, но это уже используется Я не знаю, что еще я могу сказать об этом.

Надеюсь, это понятно.

+1

Это плохой подход. Не пытайтесь получить данные из вида или элементов управления. Ваш GridViewColumn.Header связан с ColumnHeader1/2/3 ... Попробуйте получить данные оттуда. При необходимости вы можете использовать DataContext элемента управления ListView. – LPL

ответ

7

В вашем случае вы можете сделать:

((GridView)_lvContacts.View).Columns[i].Header 
+1

GridView gridView = (GridView) _lvContacts.View; string header = gridView.Columns [i] .Header.ToString(); Это было решением моей проблемы, спасибо за идею! – oleksandr

1

Вы можете получить GridView и столбцы следующим образом:

GridView gridView = (GridView)_lvContacts.View; 
foreach(GridViewColumn column in gridView.Columns) 
    // do something with column.Header. Your example: 
    if (ItsTheColumnHeaderIWant(column.Header)) 
    { 
     MyFunction(column.Header); 
    } 

Или, вы можете назвать GridView в вашем XAML:

<GridView x:Name="_gridView"...> 

И тогда вы можете просто получить к нему доступ из кода: _gridView.Columns.

+0

Подразумевается, но где 'ItsTheColumnHeaderIWant()' проверяет 'column.Header' и возвращает логическое истинное значение, если оно является правильным значением заголовка. Великое имя функции :) - хотя, если бы мы знали его имя уже, я не уверен, что нам нужно его протестировать: -P. Тем не менее, получил мой голос. – vapcguy

7

Чтобы получить все заголовки, вы можете использовать следующий код:

List<GridViewColumnHeader> headers = GetVisualChildren<GridViewColumnHeader>(_lvContacts).ToList(); 

public static IEnumerable<T> GetVisualChildren<T>(DependencyObject parent) where T : DependencyObject 
    { 
     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < childrenCount; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
      if (child is T) 
       yield return (T)child; 

      foreach (var descendant in GetVisualChildren<T>(child)) 
       yield return descendant; 
     } 
    } 
0

Использование LINQ !!!

var headers = ((GridView) _lvContacts.View).Columns.ToDictionary(column => column.Header.ToString()); 
Смежные вопросы