如何在GridViewColumn HeaderTemplate中访问我的ComboBox?

时间:2011-01-10 06:19:00

标签: c# wpf

我找到了一种模板在GridView的列标题中嵌入控件的方法。但是我不知道如何使用后面的代码找到控件以填充项目。我已经想出如何响应嵌入式控件引发的事件并确定它所在的列。否则我不知道如何获得对嵌入式ComboBox的引用。

一些代码可以给你一个想法:

<Page.Resources>
    <DataTemplate x:Key="ComboHeaderTemplate">
        <DockPanel>
            <ComboBox Name="columnHeading" />
        </DockPanel>
    </DataTemplate>
</Page.Resources>

在代码隐藏中:

        GridView grdView = new GridView();

        for (int column = 1; column <= context.data.GetLength(1); column++)
        {
            GridViewColumn gvc = new GridViewColumn();
            gvc.DisplayMemberBinding = new Binding(column.ToString());
            gvc.Header = column.ToString();
            gvc.Width = 120;
            gvc.HeaderTemplate = (DataTemplate)this.Resources["ComboHeaderTemplate"];
            grdView.Columns.Add(gvc);
        }

        ListView1.View = grdView;
        ListView1.ItemsSource = dt.DefaultView;

如果每个ComboBox都有相同的项目列表可供选择使用数据绑定,只要我可以为每列选择唯一值。

3 个答案:

答案 0 :(得分:1)

您可以使用VisualTreeHelper来检索组合框:

创建一个帮助方法以在GridViewColumn上找到组合框:

public T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childItem = FindVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }
    return null;
}

要获得对组合框的引用,请执行以下操作:

ComboBox cb = FindVisualChild<ComboBox>(gvc);

希望这就是你要找的东西?

答案 1 :(得分:1)

这就是我最终的目标。

XAML:

    <DataTemplate x:Key="ComboHeaderTemplate">
        <DockPanel>
            <ComboBox Name="columnHeading" Loaded="columnHeadingLoaded" SelectionChanged="columnHeadingSelectedChanged" Width="Auto" />
        </DockPanel>
    </DataTemplate>

代码背后:

    private void columnHeadingLoaded(object sender, RoutedEventArgs e)
    {
        ((ComboBox)sender).ItemsSource = myList;
        ((ComboBox)sender).SelectedIndex = 0;
    }

    // My columns are named "1", "2" etc
    private void columnHeadingSelectedChanged(object sender, SelectionChangedEventArgs e)
    {
        int columnIndex = int.Parse(((ComboBox)sender).DataContext.ToString()) - 1;

        if (((ComboBox)sender).SelectedIndex == 0)
        {
            this.Headings[columnIndex] = null;
        }
        else
        {
            this.Headings[columnIndex] = ((ComboBox)sender).SelectedValue.ToString();
        }
    }

我认为我应该在XAML中使用数据绑定,但这更容易。

答案 2 :(得分:0)

你可以试试这个:

 var  cbx= gvc.HeaderTemplate.LoadContent() as ComboBox;

gvc是GridViewColumn