2015-06-10 26 views
3

我目前有一大堆XAML,我正在努力重構。DataGridRowTemplateColumn - 有效地重構和使用樣式?

<DataGrid x:Name="CurrentConfigDataGrid" ItemsSource="{Binding}" > 
    <DataGrid.Resources> 
     <ResourceDictionary Source="../ResourceDictionaries/MergedDictionary.xaml" /> 
    </DataGrid.Resources> 

    <DataGrid.ItemContainerStyle> 
     <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}" /> 
    </DataGrid.ItemContainerStyle> 

    <DataGrid.Columns>    

     <DataGridCheckBoxColumn Width="25">     
     </DataGridCheckBoxColumn> 

     <DataGridTemplateColumn Width="80" CanUserResize="False" CanUserSort="False" > 
      <DataGridTemplateColumn.Header> 
       <Label Content="Type" /> 
      </DataGridTemplateColumn.Header> 
      <DataGridTemplateColumn.CellTemplate>      
       <DataTemplate> 
        <DataTemplate.Resources> 
         <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
        </DataTemplate.Resources> 
        <TextBlock Text="{Binding Type}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate>         
     </DataGridTemplateColumn> 

     <DataGridTemplateColumn Width="150" CanUserResize="False" CanUserSort="False" > 
      <DataGridTemplateColumn.Header> 
       <Label Content="Version/Date" /> 
      </DataGridTemplateColumn.Header> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DataTemplate.Resources> 
         <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
        </DataTemplate.Resources> 
        <TextBlock Text="{Binding Version}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTemplateColumn Width="150" CanUserResize="False" CanUserSort="False" > 
      <DataGridTemplateColumn.Header> 
       <Label Content="GUID" /> 
      </DataGridTemplateColumn.Header> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DataTemplate.Resources> 
         <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
        </DataTemplate.Resources> 
        <TextBlock Text="{Binding GUID}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

    </DataGrid.Columns> 
</DataGrid> 

如何拉出標準的「TextBlock」風格,以便它自動被拾取?我在開始時引用了我的MergedDictionary,但是這不會自動將DataGrid中的樣式轉換爲textBlock中的樣式,除非我手動指定它們...這意味着我需要DataGirdTemplateColumn,然後是模板等。

如何最好地重構?

回答

2

這是否工作...?

<DataGrid x:Name="CurrentConfigDataGrid" ItemsSource="{Binding}" > 
    <DataGrid.Resources> 
     <ResourceDictionary Source="../ResourceDictionaries/MergedDictionary.xaml" /> 
     <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
    </DataGrid.Resources> 
... 

從技術上講,如果你創建你的資源樣式,無鑰匙但有TargetType的,應當自動應用到沒有明確的風格集合類型的所有控制。

 <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Version}" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
+0

無論出於何種原因,這實際上並不起作用。 如果我給樣式一個x:Key並且引用它,但是,這是我會選擇的。無論如何,歡呼聲。 – jimbo

0

你有不同的標題和單元格模板,我也有question如何做選擇性模板。但是你做錯了什麼(就我而言)是在每一列的資源中重新定義樣式。

爲什麼不乾脆

<DataGridTemplateColumn Header="Type"> 
    <DataGridTemplateColumn.CellTemplate>      
     <DataTemplate> 
      <TextBlock Text="{Binding Type}" 
         Style={StaticResource TextBlock} /> 
     </DataTemplate> 
    </DataGridTemplateColumn> 

你仍然需要合併的字典,包含TextBlock風格,最好是在最高水平(WindowUserControl資源)。

+0

這並不完全工作...我不能只引用StaticResource爲「TextBlock」。 默認情況下,TextBlock在MergedDicitonary中沒有名稱以覆蓋TextBlocks。但實際上,如果我在DataGrid.Resources中將其定義爲