我们使用ContentTemplate在Silverlight DataGrid中具有自定义标头。标头中有一个按钮,需要以编程方式访问该按钮以挂接事件。我们正在使用IronPython,因此我们无法在xaml中静态绑定事件(此外,我们将网格用于许多不同的视图-因此我们会动态生成xaml)。

我们如何访问datagrid列标题内的控件?

最佳答案

好的,所以我通过遍历网格的可视树寻找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事件调用此代码很方便,这可以确保已创建标头。

10-06 13:00