C# -WPF DataGridColumnHeader в 2 строки

Я пытаюсь создать DataGridColumnHeader с 2 рядами. Я хочу, чтобы это выглядело так:

HeaderText и ID являются AttachedProperties в пользовательском DataGridColumn. Я хотел показать оба свойства со следующим шаблоном для DataGridColumnHeader:

<Style TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Margin="0">
                    <Border Margin="0"
                            BorderBrush="Black"
                            BorderThickness="0,0,0,1">
                        <TextBlock Text="{Binding Path=HeaderText, RelativeSource={RelativeSource AncestorType={x:Type ctrls:MyDataGridColumn}}}" />
                    </Border>
                    <TextBlock Text="{Binding Path=ID, RelativeSource={RelativeSource AncestorType={x:Type ctrls:MyDataGridColumn}}}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Пример для моей пользовательской колонки:
<ctrls:MyDataGridColumn HeaderText="some text" ID="1" />

HeaderText и ID не будут отображаться... какие-либо советы?

2 ответа

При работе с DataGridColumns я обычно использую Window Resources/DataTemplates, а не стили. Например:

<Window.Resources>
     <DataTemplate x:Key="TemplateName">
         <insert stackpanel & TextBlocks here/>
     </DataTemplate>
</Window.Resources>

А затем в вашем GridView установите ваш столбец следующим образом:

<GridViewColumn CellTemplate="{StaticResource TemplateName}"/>

Я прошу прощения, если это не тот ответ, который вы ищете. Но так я всегда достиг цели, о которой ты говорил. Дайте знать, если у вас появятся вопросы!

РЕДАКТИРОВАТЬ: Я также никогда не использовал такие привязки. Позвольте мне привести пример:

Вот таблица данных для gridviewcolumn, которая имеет флажок, связанный со свойством bool в классе, который находится в источнике элементов:

<DataTemplate x:Key="IssueTemplate">
    <CheckBox HorizontalAlignment="Center" IsChecked="{Binding IssueMe, Mode=TwoWay}"/>
</DataTemplate>

РЕДАКТИРОВАТЬ 2: Теперь я вижу, что вы говорите о заголовках, что делает мой ответ бессмысленным. Мои извенения. Я обычно устанавливаю заголовки на индивидуальной основе:

<GridViewColumn CellTemplate="{StaticResource IssueTemplate}">
    <GridViewColumnHeader HorizontalAlignment="Center">
        <StackPanel HorizontalAlignment="Center">
            <TextBlock Text="Issue" HorizontalAlignment="Center"/>
                <Viewbox>
                    <Button Content="Check/Uncheck All" FontSize="6" Margin="5 0 5 0" Command="{Binding CheckClick}"/>
                </Viewbox>
        </StackPanel>
    </GridViewColumnHeader>
</GridViewColumn>

Если вам нужно это в стиле, то я боюсь, что не могу больше помочь. Моим лучшим предложением было бы взглянуть на ваши привязки; что-то с ними не похоже

Удачи!

Твой подарок Binding не будет работать как DataGridColumn это не Visualпоэтому он не будет участвовать в VisualTreeтак что вы не можете пройти через это. Это просто держатель информации, больше ничего. DataGridColumnHeader вместо этого содержит свойство Column который дает вам доступ к DataGridColumn,

Итак, сделайте это для обоих свойств:

<TextBlock Text="{Binding Path=Column.HeaderText, RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}}" />

Пожалуйста, скажите, решит ли это вашу проблему.

Другие вопросы по тегам