2012-03-22 5 views
0

셀/celledit 템플릿을 공유하기 위해 DataGrid 열을 원합니다.wpftoolkit DataGridTemplateColumn 템플릿 바인딩

해결책이 있습니다 (덕분에 WPF DataGridTemplateColumn shared template?). 이제 모든 노드 중첩을 피함으로써 가독성을 향상시키고 싶습니다.

내 현재보기는 다음과 같습니다

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False"> 

    <wpftk:DataGrid.Resources> 
     <DataTemplate x:Key="CustomCellTemplate"> 
     <TextBlock Text="{TemplateBinding Content}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="CustomCellEditingTemplate"> 
     <TextBox Text="{TemplateBinding Content}"></TextBox> 
     </DataTemplate> 
    </wpftk:DataGrid.Resources> 

    <wpftk:DataGrid.Columns> 

     <wpftk:DataGridTemplateColumn Header="Start Date"> 
     <wpftk:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
      <ContentPresenter ContentTemplate="{StaticResource CustomCellTemplate}" Content="{Binding StartDate}"/> 
      </DataTemplate> 
     </wpftk:DataGridTemplateColumn.CellTemplate> 
     <wpftk:DataGridTemplateColumn.CellEditingTemplate> 
      <DataTemplate> 
      <ContentPresenter ContentTemplate="{StaticResource CustomCellEditingTemplate}" Content="{Binding StartDate}"/> 
      </DataTemplate> 
     </wpftk:DataGridTemplateColumn.CellEditingTemplate> 
     </wpftk:DataGridTemplateColumn> 

     <!--and again the whole block above for each columns...--> 

    </wpftk:DataGrid.Columns> 
    </wpftk:DataGrid> 

는 내가 달성하고자하는 것은 DataGridTemplateColumn 수준에서 값을 바인딩하고 템플릿 수준으로 전파하는 것입니다. 누구든지 그 일을 어떻게 알아? 바인딩 porperty가 DataGridTemplateColumn의 유효한 재산이 아니라 어쩌면 데이터 컨텍스트 및 일부 상대 소스를 재생하여 솔직히 트릭을 할 수도 있지만 분명히

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False"> 

    <wpftk:DataGrid.Resources> 
     <DataTemplate x:Key="CustomCellTemplate"> 
     <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="CustomCellEditingTemplate"> 
     <TextBox Text="{Binding}"></TextBox> 
     </DataTemplate> 
    </wpftk:DataGrid.Resources> 

    <wpftk:DataGrid.Columns> 
     <wpftk:DataGridTemplateColumn Header="Start Date" Binding="{Binding StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
     <wpftk:DataGridTemplateColumn Header="End Date" Binding="{Binding EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
    </wpftk:DataGrid.Columns> 
    </wpftk:DataGrid> 

: 내가해야 할 노력은 무엇

은 같은 것입니다 나는 그것을 구현할 방법을 찾을 수 없다. 내가 원하는 것은 가능하며 내가 대답

참고으로 "당신이 그렇게 할 수있는 방법을"받아 들일 기꺼이 경우

는 확실하지 : 템플릿의 TextBlock/TextBox 단지 테스트입니다 DataGridTextColumn는 속성 구문을 사용하여 DataTemplates를 지정하여 XAML 감소 당신이 일을해야 했어요 어떤 사전

답변

1

에 트릭을 감사하지 않을 것이다 (실제 템플릿은 훨씬 더 복잡하다).

편집 : 죄송합니다. 나는 당신의 질문을 오해했습니다. 소스 코드를 수정하거나 액세스하지 않고 DataGridTemplateColumn에 바인딩 가능한 속성을 추가하려면 AttachedProperty을 만들면됩니다.

예 :

public class DataBindingHelper 
{ 

    #region AttachedBinding 

    public static readonly DependencyProperty AttachedBindingProperty = DependencyProperty.RegisterAttached("AttachedBinding", typeof(Binding), typeof(DataBindingHelper), new FrameworkPropertyMetadata(null)); 

    public static Binding GetUseAncestorDataContext(DependencyObject d) 
    { 
     return (bool)d.GetValue(AttachedBindingProperty); 
    } 

    public static void SetUseAncestorDataContext(DependencyObject d, Binding value) 
    { 
     d.SetValue(AttachedBindingProperty, value); 
    } 

    #endregion 

} 

사용법 :

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False"> 

    <wpftk:DataGrid.Resources> 
     <DataTemplate x:Key="NameTemplate"> 
      <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="EditingTemplate"> 
      <TextBox Text="{Binding}"/> 
     </DataTemplate> 

     <DataTemplate x:Key="CustomCellTemplate"> 
      <ContentPresenter ContentTemplate="{StaticResource NameTemplate}" 
           Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" /> 
     </DataTemplate> 
     <DataTemplate x:Key="CustomCellEditingTemplate"> 
      <ContentPresenter ContentTemplate="{StaticResource EditingTemplate}" 
           Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" />        
     </DataTemplate> 

    </wpftk:DataGrid.Resources> 

    <wpftk:DataGrid.Columns> 
     <wpftk:DataGridTemplateColumn Header="Start Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
     <wpftk:DataGridTemplateColumn Header="End Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
    </wpftk:DataGrid.Columns> 

</wpftk:DataGrid> 

첨부 속성에 대한 자세한 내용은 다음 MSDN documentation 또는 WPF/C#을 책을 읽고. WPF의 데이터 바인딩 시스템에 대한 가장 강력한 기능 중 하나입니다.


는 또한 디버깅에 대한 자세한 내용을 알고 싶은 WPF 응용 프로그램 반복 주제에 내 최근 answer을 읽으면. 특히 스눕은 위와 관련하여 잘못된 점을 이해하는 데 도움이되었습니다.

+0

잘 모르겠다. 내 문제는 DataGridTemplateColumn에서 직접 실제 데이터를 바인딩하는 방법을 모르지만 바인딩은 DataGridTemplateColumn의 속성이 아닙니다. 편집 템플릿과 일반 템플릿을 바인딩 할 수 있지만 데이터를 템플릿에 바인딩하는 방법을 모르겠습니다. 내 생각 엔 내가 원하는 데이터로 템플릿의 DataContext를 설정하는 것입니다.하지만 그 작업을 수행하는 방법을 모릅니다. – Guillaume

+0

원래 질문에 더 잘 대답하도록 수정 된 답변입니다. – Dennis

+0

좋아요! 내가 뭘 찾고 있었는지 – Guillaume

관련 문제