我有一个非常标准的WPF DataGrid
,但标题不是文本,而是ComboBox
控件。
以下是演示的截图:
不言而喻,可能会有多个列。列以编程方式创建。
我想要做的是遍历列标题,并为每个组合框获取selectedText。
这是怎么做到的?
编辑:
我期望编写的代码将遵循这些方针:
foreach (DataGridColumnHeader columnHeader in columnHeaders)
{
var combobox = (combobox) columnHeader.controls[0];
var theDroidIAmLookingFor = combobox.Text;
}
答案 0 :(得分:1)
我不知道你如何在ColumnHeader中获得Combobox但是我假设通过ColumnHeaderStyle,所以我的方法是将SelectedValueProperty绑定到CodeBehind或ViewModel中的Property
<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实际上是组合框,所以不需要沿着visualtree下去你可以把它投射到组合框
var colHeader = (Combobox)column.Header;
也许您可以告诉我如何在列标题中定义组合框