2013-09-30 4 views
1

У меня есть datagrid в моем приложении WPF. Я пытался добавить кнопку toggle в datagridrowheader, что мне удалось сделать. Проблема, которую я пытаюсь создать стиль datagridrowheader. Если я оставил строку - RowHeaderStyle = "{StaticResource DG_RowHeader}" мои кнопки загружаются правильно. Когда я добавляю эту строку обратно, мои кнопки не появляются, почему это?WPF Datagrid RowHeaderTemplate, перезаписанный RowHeaderStyle

Насколько я вижу, DG_RowHeader - это просто стиль заголовка строки? Я хотел бы знать, как я могу применить этот стиль к моему datagridrowheader и появиться также кнопка переключения?

Мой DataGrid

<DataGrid DataContext="{Binding OrderBlock}" 
        x:Name="dataGridOrders" 
        ItemsSource="{Binding Orders}" 
        Style="{StaticResource DataGridTemplate}" 
        ColumnHeaderStyle="{StaticResource DG_ColumnHeader}"            
        RowStyle="{StaticResource DG_Row}" 
        CellStyle="{StaticResource DG_Cell}"    
        RowHeaderStyle="{StaticResource DG_RowHeader}" 
        RowDetailsTemplate="{StaticResource DG_RowDetail}"      
        AutoGenerateColumns="False" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Background="Silver" 
        RowHeaderWidth="30"      
        Margin="25,5,20,15" 
        RowDetailsVisibilityChanged="dataGridOrders_RowDetailsVisibilityChanged"> 
      <DataGrid.RowHeaderTemplate>      
       <DataTemplate> 
        <ToggleButton x:Name="RowHeaderToggleButton"          
            Click="RowHeaderToggleButton_Click" 
            Cursor="Hand"/> 
       </DataTemplate> 
      </DataGrid.RowHeaderTemplate> 

Мой DataGridRowHeader

<!-- Data Grid row with toggle button --> 
    <Style x:Key="DG_RowHeader" TargetType="{x:Type DataGridRowHeader}"> 
     <Setter Property="Width" Value="35"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridRowHeader}"> 
        <Border x:Name="DGRH_Border" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           SnapsToDevicePixels="True"> 
         <Border.Background> 
          <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> 
           <GradientStop Offset="0" Color="LightGray"/> 
           <GradientStop Offset="1" Color="WhiteSmoke"/> 
          </LinearGradientBrush> 
         </Border.Background> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Мои ToggleButton

<!-- Toogle Button --> 
    <Style TargetType="ToggleButton" x:Name="rowdetailToggleButton"> 
     <Setter Property="Padding" Value="0" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ToggleButton"> 
        <Grid>        
         <Path x:Name="DefaultPath" 
          VerticalAlignment="Top" 
          Data="M0,0 14,7 0,14 Z" 
          Fill="DarkGray" 
          Stretch="Fill" 
          Margin="6"/> 
         <Path x:Name="CheckedPath" 
          VerticalAlignment="Top" 
          Data="M0,0 14,0 7,14 Z" 
          Fill="DarkGray" 
          Stretch="Fill" 
          Margin="6" 
          Visibility="Collapsed" /> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CheckStates"> 
           <VisualState x:Name="Checked"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Duration="0" 
                     Storyboard.TargetName="DefaultPath" 
                     Storyboard.TargetProperty="Visibility"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Collapsed</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
             <ObjectAnimationUsingKeyFrames Duration="0" 
                     Storyboard.TargetName="CheckedPath" 
                     Storyboard.TargetProperty="Visibility"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
             <ColorAnimationUsingKeyFrames Storyboard.TargetName="CheckedPath" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"> 
              <SplineColorKeyFrame KeyTime="0:0:0.2" Value="LightGray" /> 
             </ColorAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Unchecked" /> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

ответ

1

Похоже, ваш забыл отображать содержимое DataGridRowHeader в DG_RowHeader стиле, точнее внутри DGRH_Border.

Вы можете добавить ContentPresenter внутри него:

<Border x:Name="DGRH_Border" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     SnapsToDevicePixels="True"> 
    [...] 
    <ContentPresenter Content="{TemplateBinding Content}" 
        ContentTemplate="{TemplateBinding ContentTemplate}"/> 
</Border> 

Как для ToggleButtons, вам необходимо либо:

  • определяют стиль в декларации ToggleButton «s:

(предполагается, что ваш стиль был определен с использованием атрибута x:Key (указанные Вами x:Name вместо)):

<Style TargetType="ToggleButton" x:Key="rowdetailToggleButton"> 
  • устанавливать стиль как стиль по умолчанию для togglebuttons удаления x:Key атрибута:

В любом случае вам необходимо убедиться в том, что ресурс ресурса доступны, где объявлена ​​кнопка.

+0

Hi Franssu Я добавил эту строку, но, похоже, ничего не изменил - все еще не видно кнопок переключения? – mHelpMe

+0

Я думаю, что забыл ContentTemplate = "{TemplateBinding ContentTemplate}" – franssu

+0

А теперь кнопки переключения теперь отображаются, но стиль отсутствует? – mHelpMe