2011-08-03 5 views
0

DataGrid을 사용하고 AutogenerateColumnstrue으로 설정하고 있습니다.모든 DataGrid 헤더에는 고유 한 이름이 있어야합니다 - 해결 방법

저는 약식 입력 DataTableDataContext 속성을 통해 바인딩합니다.

myGrid.Columns[x].Header 값이 기본 DataTable (분명히 중복 된 열 이름이 허용되지 않음)의 열 이름에 직접 연결되어 있기 때문에 모든 헤더에 고유 한 이름이 있어야한다는 문제가 있습니다.

현명한 해결 방법이 있습니까? DataGridHeaders를 들어

이 변경되는 다음 코드는 안된

+0

문제에 대해 자세히 설명해 주시겠습니까? Isnt DataTable은 원하는 것 (컬럼 이름의 고유성)을 올바르게 수행합니까? –

+0

'DataGrid'에 고유하지 않은 헤더가 있기를 원합니다 - 표시 이름; UI에서! 'DataTable'에서 열 이름에 영향을 미치지 않고 (예외를 발생시킵니다). 나는 (보이는) 헤더 이름이 (논리적 인) 컬럼 이름과 연결되는 것을 원하지 않는다; 하지만 지금은 그렇습니다. –

답변

1

..., 당신은 자신의 ContentTemplate를 오버라이드 (override) 할 것입니다. 상기 코드 DynamicColumnHeaderTextConverter의 변환() 메소드

<DataGrid.Resources> 
    <Style TargetType="{x:Type dg:DataGridColumnHeader}"> 
     <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock> 
         <TextBlock.Text> 
          <MultiBinding Converter="{StaticResource DynamicColumnHeaderTextConverter}"> 
           <Binding BindsDirectlyToSource="True"/> 
           <Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType={x:Type dg:DataGrid}}" /> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </DataGrid.Resources> 

2 개 값

  1. 열 헤더 즉 DataTable의 열 이름
  2. DataTable에 자신을받을 것이다.

고유하지 않은 이름을 반환합니다.

public class DynamicColumnHeaderTextConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, ...) 
     { 
       var columnName = (string)values[0]; 
       var dataTable = (DataTable)values[1]; //// if you want to decide name based on some value in the DataTable. 
       switch(columnName) 
       { 
        case "MyColumn1" : return "MyColumn"; 
        case "MyColumn2" : return "MyColumn"; 
       } 

       return columnName; 
     } 
    } 

이 정보가 도움이되는지 알려주십시오.

+0

감사합니다. 내일 (이젠 거의 끝났어. :)). Btw 나는 이미'DataGridColumnHeader'''ContentTemplate'을 오버 라이딩 했으므로 여러분이 제안한 코드를 통합 할 것입니다. 나는 당신에게 알려줄 것이다 –

+0

나는 그것을 시험해 보았다. 그러나 불행하게도 그것은 효과가 없다. XamlParseException이 발생합니다 : "A 'Binding'은 'Binding'유형의 'Path'속성에서 설정할 수 없습니다. 'Binding'은 DependencyObject의 DependencyProperty에서만 설정할 수 있습니다." –

+0

안녕하세요, Vibo, 코드 실수로 유감스럽게 생각합니다 ... Binding BindsDirectlyToSource = "True"/> ... 위의 코드를 수정했습니다 ... 문제가 생겨서 죄송합니다. 다시! –

관련 문제