2010-04-02 4 views
2

나는 App.xaml에서 데이터 그리드 스타일을 가지고 : 이것은 내 응용 프로그램에서 내 데이터 격자의 모든 위대한 작품ItemsPresenter가 DataGrid의 전경 스타일을 재정의하는 이유는 무엇입니까?

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="Foreground" Value="{StaticResource DataGridItemTextBrush}" /> 
    <Setter Property="VerticalGridLinesBrush" Value="{StaticResource GridBrush}" /> 
    <Setter Property="HorizontalGridLinesBrush" Value="{StaticResource GridBrush}" /> 
    <Setter Property="RowBackground" Value="Transparent" /> 
    <Setter Property="Background" Value="Transparent" /> 
    <Setter Property="HeadersVisibility" Value="Column" /> 
    <Setter Property="AlternatingRowBackground" Value="#77000000" /> 
</Style> 

. 그러나 내 데이터 격자 중 하나에 대해 특정 열이 동일한 값을 공유하는 경우 행을 그룹화하려고합니다.

<DataGrid.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Path=Name}" Padding="3"/> 
       </StackPanel> 
      </DataTemplate> 
     </GroupStyle.HeaderTemplate> 
     <GroupStyle.ContainerStyle> 
      <Style TargetType="{x:Type GroupItem}" > 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type GroupItem}"> 
          <Expander> 
           <Expander.Resources> 
            <Style TargetType="{x:Type TextBlock}"> 
             <Setter Property="Foreground" Value="White" /> 
            </Style> 
           </Expander.Resources> 
           <Expander.Header> 
            <StackPanel Orientation="Horizontal"> 
             <TextBlock Text="{Binding Path=Name, StringFormat=Set: {0}}" Margin="5,0"/> 
             <TextBlock Text="{Binding Path=ItemCount, StringFormat=(\{0\} Games)}"/> 
            </StackPanel> 
           </Expander.Header> 
           <ItemsPresenter /> 
          </Expander> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
</DataGrid.GroupStyle> 

문제 : 그래서 특정 데이터 그리드에서 다음을 사용하는 대신 내 스타일의 검은 색과 텍스트 (전경) 표시를 제외하고 이제이 데이터 그리드가 올바르게 내 데이터 그리드 스타일을 기반으로 모든 것을 표시합니다.

솔루션 :

<ItemsPresenter TextElement.Foreground="{StaticResource DataGridItemTextBrush}"/> 

또는

<ItemsPresenter TextBlock.Foreground="{StaticResource DataGridItemTextBrush}" /> 

: 다음 중 하나에 내 ItemsPresenter를 수정하여 (이 필요한 이유 이해가 안하지만) 나는 문제를 해결할 수질문 : 왜 이런 일이 발생하는지 설명하고 더 나은 솔루션을 제공하여 ItemsPresenter가 DataGrid 스타일을 재정의하지 않을 수 있습니까?

감사합니다.

답변

2

아동이 부과 된 스타일을 무시하지 않는 한 스타일이 적용됩니다. 귀하의 경우 ItemsPresenter에는 기본값이 있습니다. DataGrid 스타일 내에서 우선 적용되지 않습니다. 요구 사항을 충족 시키거나 명시 적 또는 암시 적 스타일을 통해 로컬에서 값을 수정하거나 제안 된 솔루션을 선택하기 위해 App.xaml 내에 ItemsPresenter 스타일을 작성하십시오.

기본 스타일을 상속하려면 BasedOn 속성을 사용할 수 있습니다. 특정 속성 만 재정의합니다.

BasedOn="{StaticResource {x:Type DataGrid}}" 
+0

아아아 ... 대답! 결코 늦지 않은 것이 좋을까요? 몇 가지 ... 1) ItemsPresenter는 DataGrid의 'Foreground'만 변경하지만 '배경'은 변경하지 않는 이유는 무엇입니까 (예 : Transformer 대신 DataGrid 스타일의 배경을 녹색으로 변경) 2) ItemsPresenter를 기반으로 DataGrid의 스타일에서 예외가 throw됩니다. – Scott

+0

간단한 문제 해결 방법이 있지만 문제는 "ItemsPresenter가 DataGrid의 포어 그라운드를 변경하는 이유는 무엇입니까?하지만 Background와 같은 DataGrid의 다른 속성은 변경하지 않는 이유는 무엇입니까?" ItemsPresenter에는 'Foreground'속성이 없기 때문에 'Foreground'에 대한 자체 기본값이있는 것과 다릅니다. 그리고 만약 그렇다면 ... DataGrid의 스타일에서 상속받습니다. – Scott

+1

@Scotss DataGrid BasedOn 참조는 처음부터 DataGrid의 표준 모양을 상속하는 것이 었습니다. ItemsPresenter에는 Foreground 속성이 없지만 현재 표시된 텍스트를 렌더링해야하며 ControlTemplate 내의 컨트롤이있을 가능성이 높습니다. 따라서 TextBlock 유형을 통해 Foreground가 변경됩니다. 로컬 XAML 파일에서 TextBlock의 기본 스타일을 만들고 Foreground Red를 만들어서 어떤 일이 발생하는지 확인하십시오. –