0

DataGridヘッダーがテキストではなくComboBoxコントロールであることを除いて、かなり標準的なWPFがあります。

デモ用のスクリーンショットを次に示します。

ここに画像の説明を入力

複数の列が存在する可能性があることは言うまでもありません。列はプログラムで作成されます。

私がやりたいことは、列ヘッダーをトラバースし、各コンボボックスの 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 に答える