Как я могу получить доступ к своим ComboBox внутри GridViewColumn HeaderTemplate? - PullRequest
0 голосов
/ 10 января 2011

Я нашел способ встроить элементы управления в заголовки столбцов GridView.Однако я не знаю, как найти элементы управления, используя мой код, чтобы заполнить их элементами.Я выяснил, как реагировать на событие, вызванное встроенным элементом управления, и определить, в каком столбце оно находится. В противном случае я не знаю, как получить ссылку на встроенные списки.

Некоторый код, который может дать вамИдея:

<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 ]

1 голос
/ 12 января 2011

Вот что у меня получилось.

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, но это было проще.

1 голос
/ 10 января 2011

Вы можете использовать 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);

Надеюсь, это то, что вы ищете?

0 голосов
/ 29 октября 2013

Вы можете попробовать это:

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

gvc is GridViewColumn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...