Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Заголовок колонки при группировке dataGrid  [new]
sergiy_s
Member

Откуда:
Сообщений: 185
добрый день
При группировке данных в дата гриде
можно с помощью шаблона GroupItem отобразить
Название поля по которому происходит группировка и число записей

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander IsExpanded="True"  >
                        <Expander.Header>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Name}" Margin="3"/>
                                <TextBlock Text="{Binding ItemCount}" Margin="3" />
                            </StackPanel>
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Как отобразить еще и название колонки по которой происходит группировка?
13 дек 09, 23:17    [8060930]     Ответить | Цитировать Сообщить модератору
 Re: Заголовок колонки при группировке dataGrid  [new]
sergiy_s
Member

Откуда:
Сообщений: 185
так как ни кто этой темой не озадачен пришлось почесать репу и написать самому
может пригодится кому
функция ищет по дата контекст PropertyGroupDescription
public static PropertyGroupDescription FindPropertyGroupDescription(object GroupDataContext)
        {
            Type DataContextType = GroupDataContext.GetType();
            PropertyInfo CollectionVievGroupPropertyInfo = DataContextType.GetProperty("Parent", BindingFlags.NonPublic | BindingFlags.Instance);
            MethodInfo getParent = CollectionVievGroupPropertyInfo.GetGetMethod(true);
            object Parent = getParent.Invoke(GroupDataContext, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[0], System.Globalization.CultureInfo.CurrentCulture);

            Type ParentType = Parent.GetType();
            PropertyInfo GroupByPropertyInfo = ParentType.GetProperty("GroupBy", BindingFlags.NonPublic | BindingFlags.Instance);
            MethodInfo GroupByMetod = GroupByPropertyInfo.GetGetMethod(true);
            PropertyGroupDescription GroupBy = GroupByMetod.Invoke(Parent, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[0], System.Globalization.CultureInfo.CurrentCulture) as PropertyGroupDescription;
            return GroupBy;
        }

хамл
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander Name="XExpanderH" IsExpanded="True" Background="LightCoral"   >
                        <Expander.Header  >
                            <StackPanel Orientation="Horizontal" Loaded="Header_Loaded" >
                                <TextBlock Text="Группировка полю ("/>
                                <TextBlock x:Name="CollumnHeaderTextBlock" FontWeight="bold" />
                                <TextBlock Text=") "/>
                                <TextBlock Text="{Binding Name}" FontWeight="bold" />
                                <TextBlock Text=" пунктов-("/>
                                <TextBlock Text="{Binding ItemCount}"/>
                                <TextBlock Text=")"/>
                            </StackPanel>
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>



//  загрузкa заголовка группы
 private void Header_Loaded(object sender, RoutedEventArgs e)
        {
            StackPanel Stack = sender as StackPanel;//нашли элемент sender
            DataGrid rDataGrid = Helper.FindVisualParent<DataGrid>(Stack);//нашли родительский дата грид
            //по дата контексту нашли PropertyGroupDescription
            PropertyGroupDescription GroupBy = FindPropertyGroupDescription(Stack.DataContext);

            TextBlock CollumnHeaderTextBlock = LogicalTreeHelper.FindLogicalNode(Stack,  "CollumnHeaderTextBlock") as TextBlock;

            foreach (DataGridColumn column in rDataGrid.Columns)//прошли по колонкам 
            {
                if (Helper.FindBoundProperty(column) == GroupBy.PropertyName)//получили имя к которому была "прибиндина" колонка
                {
                    CollumnHeaderTextBlock.Text = column.Header.ToString();
                    return;//нашли и установил в заголовке группы текст из заголовка колонки по котрой была группировка
                }
            }//если не нашли нужную колонку текст группы установили по имени группы 
            CollumnHeaderTextBlock.Text=GroupBy.PropertyName;
        
        }
17 дек 09, 15:42    [8081470]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить