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;
列ヘッダーでコンボボックスを定義する方法を教えてください。