Доступ к базовым свойствам ViewModel в WPF DataGrid GroupItem DataTemplate - PullRequest
2 голосов
/ 28 марта 2011

У меня есть сгруппированная WPF DataGrid (стандартная Microsoft), представляющая некоторые данные пользовательского интерфейса для наших пользователей.

Чтобы показать итоги в сгруппированных регионах, мы переопределяем шаблон данных GroupItem следующим образом в XAML:

<Style TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Border BorderBrush="DarkGray" BorderThickness="1" Padding="12,0">
                    <Expander VerticalContentAlignment="Center" IsExpanded="{Binding ., Converter={Converters:ExpandedGroupConverter}}" ExpandDirection="Up">
                        <Expander.Header>
                                <Canvas>
                                **<TextBlock Text="{Binding} />**
                            </Canvas>
                        </Expander.Header>
                        <ItemsPresenter/>
                    </Expander>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

В настоящее время во время выполнения текст TextBlock привязывается к DataContext, который представляет собой CollectionViewGroup, что имеет смысл, поскольку сетка привязывается к CollectionView, охватывающему наш источник данных.

Однако CollectionViewGroup очень ограничена и не дает нам доступа к содержащему ее ViewModel, где мы храним свойства, например, для расположения групп (мы собираем координаты из столбцов, когда мы сначала размечаем сетку), и нам нужно привязать их, чтобы мы могли, например, показать итоговое значение непосредственно над / под данным столбцом в группе.

Короче говоря, мы пытаемся получить доступ не только к объекту CollectionView из DataTemplate, который нацелен на GroupItem. Любой вклад в то, как это сделать (или, если есть лучший подход, чтобы получить итоговые итоги по столбцам для отображения в шаблонах итогов группы), приветствуется.

РЕДАКТИРОВАТЬ: Пока что обходной путь должен иметь свойство "Parent ViewModel" на наших элементах, хотя это раздувает модель, я хотел бы, чтобы был более прямой способ сделать это.

1 Ответ

3 голосов
/ 28 марта 2011

CollectionViewGroup предоставляет вам доступ ко всем элементам, содержащимся в этой группе.если вы хотите получить доступ к другой информации из вашего шаблона, вы можете попробовать связать с RelativSource.

EDIT:

, так что если у вас есть Collection of ItemVM, и поверх этого CollectionViewGroup наItemVM.GroupProperty.тогда вы можете получить доступ к своему 1-му ItemVM в группе с помощью

 Binding={ Path = Items[0].AnyPropertyOnItemVM }

. Я думаю, вам придется использовать конвертер, если вы хотите вычислить или сделать что-нибудь с GroupItems

...