Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > получить DataGridColumnHeader из DataGridColumn


Автор: SeregaS 4.4.2009, 09:37
У стандартного DataGrid 
у каждой колонки есть свойство Header
по идее оно должно возвращать ссылку на DataGridColumnHeader
однако содержит только имя колонки 
 
и как "выцепить" оттуда DataGridColumnHeader ??

Автор: Idsa 4.4.2009, 09:49
У свойства Header какой тип?

Автор: SeregaS 4.4.2009, 10:37
Header обьект 
но под отладчиком видно что он строка 
foreach (DataGridColumn coll in this.Columns)
            {
               String x = coll.Header.GetType().FullName;// x=  System.String
                
            }

Автор: Человек01 12.4.2009, 19:35
SeregaS, можно вопрос, в связи с твоим вопросом? Вот загнул... Для какой цели требуется узнать DataGridColumnHeader
Если требуется в динамике изменить визуальное представление Header или же прочитать текущее представление Header то можно проделать такое:
Код

<Window x:Class="test006_DataGrid_columnHeader.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wpf="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
    Title="Window1" Height="300" Width="400">
    <Window.Resources>
        <CollectionViewSource x:Key="collection"/>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <wpf:DataGrid x:Name="datagrid1" DataContext="{StaticResource collection}" ItemsSource="{Binding}"/>
            <Button Click="Button_Click">"выцепляем" DataGridColumnHeader вернее Header и меняем его :)</Button>
        </StackPanel>
    </Grid>
</Window>

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

namespace test006_DataGrid_columnHeader
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Window1_Loaded);
        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("column1", typeof(String));
            dt.Columns.Add("column2", typeof(String));
            dt.Columns.Add("column3", typeof(String));
            dt.Rows.Add(new object[] { "Привет", "раз", "1" });
            dt.Rows.Add(new object[] { "Прювет", "два", "2" });
            dt.Rows.Add(new object[] { "Хайя", "три", "3" });
            dt.Rows.Add(new object[] { "Алоха", "четыре", "4" });
            ((CollectionViewSource)this.Resources["collection"]).Source = dt.DefaultView;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button bd=new Button();
            bd.Content="вот ведь";
            datagrid1.Columns[0].Header = bd;
        }
    }
}

В общем пользуемся и говорим Человеку спасибо  smile 
P.S.:Если же требуется провернуть что то другое, то не мог бы ты немного конкретизировать суть вопроса?

Автор: SeregaS 17.4.2009, 11:26
мне надо  было к каждой колонке прикрепить контекстное меню 
я решил эту задачу таким образом
меню прикрепляетя при клике на колонку
естевственно один раз при первом клике
а вот то что из колонки сложно получить Неадер это не доработка microsoft

Автор: interv 16.7.2013, 09:20
Не понял, задача решена? Если нет, то XAML в студию плз.

Самый топорный способ, так сказать на вскидку.

Код

<DataGrid AutoGenerateColumns="False">
      <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContextMenu">
              <Setter.Value>
                <ContextMenu>
                  <ContextMenu.Style>
                    <Style>
                      <EventSetter Event="ContextMenu.Opened" Handler="HeaderContextMenuOpen" />
                    </Style>
                  </ContextMenu.Style>
                </ContextMenu>
              </Setter.Value>
            </Setter>
          </Style>
      </DataGrid.Resources>
      <DataGrid.Columns>
        <DataGridTextColumn Width="*" Binding="{Binding Path=column1}" Header="Колонка1" />
        <DataGridTextColumn Width="*" Binding="{Binding Path=column2}" Header="Колонка2" />
      </DataGrid.Columns>
</DataGrid>


Код

private void HeaderContextMenuOpen(object sender, RoutedEventArgs e)
    {
      if (sender is ContextMenu)
      {
        ContextMenu menu = sender as ContextMenu;
        menu.Items.Clear();
        if (menu.PlacementTarget is DataGridColumnHeader)
        {
          DependencyObject dO = menu.PlacementTarget;
          while (!(dO is DataGrid) && dO != null)
            dO = VisualTreeHelper.GetParent(dO);
          if (dO is DataGrid)
          {
            //Вот тут у тебя есть 2 переменные
            //DataGridColumnHeader dgch = menu.PlacementTarget as DataGridColumnHeader;
            //DataGrid datagrid = dO as DataGrid;
          }
          else
            e.Handled = !e.Handled;
        }
      }
    }

Автор: interv 16.7.2013, 09:45
 smile Блин! Не посмотрел на дату, сори са поднимание темы!

Автор: dzaraev 16.7.2013, 10:28
Цитата(SeregaS @  17.4.2009,  11:26 Найти цитируемый пост)
мне надо  было к каждой колонке прикрепить контекстное меню 
я решил эту задачу таким образом
меню прикрепляетя при клике на колонку


Не самый удобный способ (как и все предложенные).
Предлагаю чисто XAML вариант (каждому хедеру - своё меню).
Если не желаете хранить меню прямо в исходном файле, можете перенести их в другой словарь и свойству Value присвоить значение через StaticReference.
Код

        <DataGrid x:Name="mygrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="My Column 1" Binding="{Binding Field1}" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu>
                                        <MenuItem Header="Do This from Column ONE"/>
                                        <MenuItem Header="Do That from Column ONE"/>
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="My Column 2" Binding="{Binding Field2}" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu>
                                        <MenuItem Header="Do This from Column TWO"/>
                                        <MenuItem Header="Do That from Column TWO"/>
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>



Цитата(SeregaS @  17.4.2009,  11:26 Найти цитируемый пост)
а вот то что из колонки сложно получить Неадер это не доработка microsoft 

Не соглашусь. DataGridColumnHeader относится по своей природе, и соответственно используется в визуальном дереве, тогда как компоновка интерфейса в ран-тайме осуществляется обычно в логическом дереве. Поэтому, чтобы осуществить такую ран-тайм компоновку в понятиях визуального дерева, приходится прибегать к API визуального дерева, например к VisualTreeHelper.
Подробнее о деревьях WPF тут: http://msdn.microsoft.com/ru-ru/library/ms753391(v=vs.100).aspx

Update
Цитата

Блин! Не посмотрел на дату, сори са поднимание темы! 

Нормально, возможно у кого-то схожая проблема ) Желательно, конечно, чтобы отметили как решенный.

Автор: gambit 16.7.2013, 12:16
Отметил как решенный.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)