0

我有一个DataGrid非常标准的 WPF,除了标题不是文本,而是一个ComboBox控件。

这是一个屏幕截图来演示:

在此处输入图像描述

不用说可能有多个列。这些列是以编程方式创建的。

我想做的是遍历列标题,并为每个组合框获取 selectedText。

这是怎么做到的?

编辑:

我希望编写的代码如下:

foreach (DataGridColumnHeader columnHeader in columnHeaders)
{
    var combobox = (combobox) columnHeader.controls[0];
    var theDroidIAmLookingFor = combobox.Text;  
}
4

1 回答 1

1

我不知道你如何在 ColumnHeader 中获得 Combobox,但我假设是通过 ColumnHeaderStyle,所以我的方法是将 SelectedValueProperty 绑定到 CodeBehind 或 ViewModel 中的属性

<ComboBox x:Name="headerComboBox" ItemsSource="{Binding Path=headerSource}">
<ComboBox.SelectedValue>
    <Binding Path="HeaderSelectedValue" Mode="TwoWay" />
</ComboBox.SelectedValue>

编辑: C# 解决方案(未测试)

foreach (var column in myGrid.Columns)
{
    var colHeader = (DependencyObject)column.Header;
    var headerComboBox = colHeader.GetChildOfType<ComboBox>();
    var selected = headerComboBox.SelectedValue.ToString();
}

这是 ExtensionMethod GetChildOfType

public static T GetChildOfType<T>(this DependencyObject depObj) where T : DependencyObject
{
    if (depObj == null) return null;
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        var child = VisualTreeHelper.GetChild(depObj, i);

        var result = (child as T) ?? GetChildOfType<T>(child);
        if (result != null) return result;
    }
    return null;
}

编辑 2:如果你像这样定义 ColumnHeader

<DataGridTextColumn Width="250">
    <DataGridTextColumn.Header>
        <ComboBox Width="200">
            <ComboBox.Items>
                <ComboBoxItem Content="Test1"/>
                <ComboBoxItem Content="Test2"/>
            </ComboBox.Items>
        </ComboBox>
    </DataGridTextColumn.Header>
</DataGridTextColumn>

然后 column.Header 实际上是组合框,因此无需向下查看可视树,您只需将其转换为组合框

var colHeader = (Combobox)column.Header;

也许您可以告诉我如何在列标题中定义组合框

于 2013-08-07T21:11:24.010 回答