DataGridRowTemplateColumn - 有效地重构和使用样式?

时间:2015-06-10 09:42:21

标签: c# wpf xaml datagrid

我目前有一大块XAML,我正在努力重构。

<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 个答案:

答案 0 :(得分:2)

这是否有效??

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

从技术上讲,如果你在资源中创建一个Style,没有Key但是有一个TargetType,它应该自动应用于那个没有明确Style样式的那个控件。

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

答案 1 :(得分:0)

你有不同的标题和单元格模板,我还有question如何进行选择性模板化。但你做错了(就我而言)是为每一列重新定义资源的风格。

为什么不简单

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

您仍然需要合并包含TextBlock样式的字典,最好是在最高级别(WindowUserControl资源上)。