2016-11-01 4 views
0

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

enter image description here

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 ... любые советы?

ответ

0

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

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

И затем, в вашем GridView, установите столбец как это:

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

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

EDIT: Я так и не использовал привязки. Позвольте мне привести пример:

Вот является DataTemplate для GridViewColumn, который имеет флажок, который привязан к свойству BOOL в классе, который находится в источнике пунктов:

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

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

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

Удачи вам!

0

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

Таким образом, сделать это для обоих свойств:

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

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

Смежные вопросы