2017-02-10 4 views
0

지난 2 일 동안 열의 ACTUAL (보이지 않는) 인덱스를 기반으로 열 헤더에 대한 데이터 템플릿을 만들려고했습니다. 아무도 나에게 올바르게 가르쳐 주실 수 있습니까?Xceed DataGridControl 열 인덱스에 바인딩하는 방법

<!--http://stackoverflow.com/questions/13693619/change-the-color-of-a-grid-header-using-xceed-datagrid-in-wpf--> 
<ControlTemplate x:Key="HeaderTemplate" TargetType="{x:Type xcdg:ColumnManagerCell}"> 
    <DockPanel> 
     <TextBlock DockPanel.Dock="Top" Text="{TemplateBinding Content}" x:Name="TextContainer"/> 
     <TextBlock Visibility="{Binding Step, Converter={StaticResource Mapping}}" x:Name="WorkElement" DockPanel.Dock="Top" Foreground="Red" Width="100"> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource Conv}"> 
        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="ParentColumn.VisiblePosition"></Binding> 
        <Binding Path= "FileModel.Columns"></Binding> 
        <Binding ElementName="TextContainer" Path="Text"></Binding> 
        <Binding ElementName="WorkElement" Path="Text"></Binding> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DockPanel> 
</ControlTemplate> 
<Style TargetType="{x:Type xcdg:ColumnManagerRow}"> 
    <Setter Property="Background" Value="AliceBlue"/> 
    <Setter Property="BorderBrush" Value="Black"/> 
    <Setter Property="AllowColumnReorder" Value="False"/> 
</Style> 

<Style TargetType="{x:Type xcdg:ColumnManagerCell}"> 
    <Setter Property="Template" Value="{StaticResource HeaderTemplate}"/> 
</Style> 

변환기 :

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
    var context = values[1] as IEnumerable<MatrixImportColumn>; 
    if (values[1] != null && values[0] != null 
     && values[0] != DependencyProperty.UnsetValue 
     && values[1] != DependencyProperty.UnsetValue) 
    { 
     var itemContext = (int)values[0]; 
     var original = values[2] as string; 
     if (context != null) 
     { 
      var dp = context.FirstOrDefault(x => x.ColumnIndex == itemContext); 
      return string.Format("{0} -> {1}", original, dp.MappedInto); 
     } 

    return string.Format("{0} -> [Unmapped]", original); 
    } 

    var val = values[3] as string; 
    if (val != string.Empty) 
     return val; 
    else return ""; 
} 

내 모델은이 :

public DataTable Model 
{ 
    get { return _model; } 
    set 
    { 
     _model = value; 
     OnPropertyChanged(); 
    } 
} 
+0

우리가 당신을 지원할 수 있도록 현재 코드를 보여주십시오. – dymanoid

+0

'Column.VisiblePosition'은 어떻습니까? 네가 다른 것을 필요로하는지 나는 모른다. – grek40

+0

@dymanoid가 업데이트되었습니다. – Hristo

답변

0

위한 뒤에

<Grid x:Name="grid1"> 
    <xd:DataGridControl ItemsSource="{Binding Data}"> 
     <xd:DataGridControl.Resources> 
      <ControlTemplate x:Key="HeaderTemplate" TargetType="{x:Type xd:ColumnManagerCell}"> 
       <DockPanel> 
        <TextBlock DockPanel.Dock="Top" Text="{TemplateBinding Content}" x:Name="TextContainer"/> 
        <TextBlock Text="{Binding Path=ParentColumn.VisiblePosition,RelativeSource={RelativeSource TemplatedParent}}" Foreground="Red"/> 
       </DockPanel> 
      </ControlTemplate> 
      <Style TargetType="{x:Type xd:ColumnManagerRow}"> 
       <Setter Property="Background" Value="AliceBlue"/> 
       <Setter Property="BorderBrush" Value="Black"/> 
       <Setter Property="AllowColumnReorder" Value="False"/> 
      </Style> 
      <Style TargetType="{x:Type xd:ColumnManagerCell}"> 
       <Setter Property="Template" Value="{StaticResource HeaderTemplate}"/> 
      </Style> 
     </xd:DataGridControl.Resources> 
    </xd:DataGridControl> 
</Grid> 

코드 그래서 난 그냥 데이터 그리드에 내장 사용되는 솔루션을 찾을 수 없습니다. 문제는 어떤 식 으로든 실제 색인을 검색 할 수 없다는 것입니다.

2

ColumnManagerCellParentColumn 속성이 Cell에서 파생 부모 열은 VisiblePosition 속성이 있습니다. 가시 열 인덱스에 대해 바인딩합니다 (열을 이동할 때 변경됩니다). 일반적으로

:

<TextBlock Text="{Binding Path=ParentColumn.VisiblePosition,RelativeSource={RelativeSource AncestorType={x:Type xd:Cell}}}"/> 

당신의 ControlTemplate 경우 :

<TextBlock Text="{Binding Path=ParentColumn.VisiblePosition,RelativeSource={RelativeSource TemplatedParent}}"/> 

나는 xd 일관성있는 볼의 위치를하기 위해

xmlns:xd="http://schemas.xceed.com/wpf/xaml/datagrid"로, 당신이 열 재정렬을 해제 할 수 있습니다 사용 ColumnManagerRow 스타일.

<Style TargetType="xd:ColumnManagerRow"> 
    <Setter Property="AllowColumnReorder" Value="False"/> 
</Style> 

편집 여기

약간의 정적 테스트 데이터와 코드에서 파생 동작하는 예제입니다. 귀하가 필요로하는 것 또는 귀하의 경우 다른 것을 설명하십시오. 이 예에서 열 헤더의 정적으로 추가 된 숫자는 동적으로 추가 된 VisiblePosition 수와 같습니다. 결국 데이터 생성

public DataTable Data { get; set; } 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    Data = new DataTable("My Data Table"); 
    for (int i = 0; i < 100; i++) 
    { 
     Data.Columns.Add("Column " + i + " Head"); 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     var row = Data.NewRow(); 
     for (int j = 0; j < 100; j++) 
     { 
      row.SetField(j, string.Format("{0},{1}", i, j)); 
     } 
     Data.Rows.Add(row); 
    } 
    grid1.DataContext = this; 
} 
+0

가상화 권한으로 인해 보이는 위치가 어떤 방식 으로든 영향을받지 않습니다. – Hristo

+0

실제 색인 (모델의 색인)을 가져와야합니다. – Hristo

+0

@Hristo 그런 다음 어떤 종류의 색인을 말하고 있는지 설명하십시오. 모델에서 가져온 것이면 모델의 인덱스 속성을 포함시킵니다. – grek40

관련 문제