2010-03-17 4 views
3

У нас есть пользовательские заголовки в Silverlight DataGrid с помощью ContentTemplate. У нас есть кнопка в заголовке и нужно программно получить доступ к кнопке, чтобы подключить событие. Мы используем IronPython, поэтому мы не можем статически связывать событие в xaml (плюс мы используем сетку для многих разных представлений - так что мы динамически генерируем xaml).Элементы управления доступом в заголовке столбца Silverlight DataGrid из кода

Как мы можем получить доступ к элементам управления внутри заголовка столбца datagrid?

ответ

2

Итак, я решил это, пройдя визуальное дерево сетки, ищущего DataColumnHeader, - а затем идя по дереву заголовка и нахожу нашу кнопку.

код ходить визуальное дерево:

from System.Windows.Media import VisualTreeHelper 

def findChildren(parent, findType): 
    count = VisualTreeHelper.GetChildrenCount(parent) 
    for i in range(count): 
     child = VisualTreeHelper.GetChild(parent, i) 
     if isinstance(child, findType): 
      yield child 
     else: 
      for entry in findChildren(child, findType): 
       yield entry 

Это называется так:

from System.Windows.Controls import Button 
from System.Windows.Controls.Primitives import DataGridColumnHeader 

for entry in findChildren(self._gridControl, DataGridColumnHeader): 
    for button in findChildren(entry, Button): 
     button.Click += handler 

Обратите внимание, что удобное время для звонка этот код из события grid.Loaded, это гарантирует, что заголовки созданы.

0

Вы пробовали метод FrameworkElement.GetTemplateChild()?

+0

Это выглядит полезным. У нас есть ссылка на экземпляр DataGrid, как мне получить доступ к ControlTemplate, чтобы использовать FrameWorkElement.GetTemplateChild()? – fuzzyman

+0

Хммм ... плюс этот метод защищен. – fuzzyman

Смежные вопросы