DataGridColumn普通样式和编辑样式

一般情况下DataGridBoundColumn和DataGridComboBoxColumn足以满足多数列的样式,如果需要自定义列样式,则可以使用DataGridTemplateColumn类型。

在设置列编辑样式之前,我们先创建一个简单的DataGrid,分别显示名称(用默认的DataGridTextColumn),和分数(使用DataGridTemplateColumn来定义自定义模板:一个ProgressBar):

<DataGrid Name="dataGrid" AutoGenerateColumns="False">  
 
        <DataGrid.Columns>  
 
            <DataGridTextColumn Header="姓名"   
 
                               Binding="{Binding Name}" 
 
                               Width="*">  
 
            </DataGridTextColumn>  
 
            <DataGridTemplateColumn Header="分数" 
 
                                   Width="2*">  
 
                <DataGridTemplateColumn.CellTemplate>  
 
                    <DataTemplate>  
 
                        <ProgressBar Value="{Binding Score}"/>  
 
                    </DataTemplate>  
 
                </DataGridTemplateColumn.CellTemplate>  
 
            </DataGridTemplateColumn>  
 
        </DataGrid.Columns>  
 
    </DataGrid>  


背后数据代码是这样:

dataGrid.ItemsSource = new people[]  
 
            {  
 
                new people(){ Name = "", Score = 100 },  
 
                new people(){ Name = "", Score = 30 },  
 
                new people(){ Name = "", Score = 86 },  
 
                new people(){ Name = "", Score = 50 }  
 
            };  
 
            //people类就不用再说了,两个属性:Name和Score  

结果就是:

image

第一列默认是可以编辑的(由于使用默认的DataGridTextColumn),而第二列我们只定义了显示的模板,无法实现编辑。
 

1:设置DataGridBoundColumn

从上面类型树上可以看到,DataGridBoundColumn是DataGridTextColumn,DataGridHyperlinkColumn和DataGridCheckBoxColumn的父类。作为父类,DataGridBoundColumn定义了两个属性来设置这些子类的普通样式和编辑样式。分别是ElementStyle和EditingElementStyle。它们都是Style对象(WPF中的样式)。这个Style的TargetType根据列的类型所变化。比如DataGridTextColumn,普通样式是针对TextBlock的。而编辑样式则应该针对TextBox。而DataGridCheckBoxColumn得普通样式和编辑样式都应该针对CheckBox的。

所以把上面的XAML中的第一个列这样设置:

<DataGridTextColumn Header="姓名"   
 
                               Binding="{Binding Name}" 
 
                               Width="*"> 
 
                <DataGridTextColumn.ElementStyle> 
 
                    <Style TargetType="TextBlock"> 
 
                        <Setter Property="Foreground" Value="Red"/> 
 
                        <Setter Property="TextAlignment" Value="Center"/> 
 
                    </Style> 
 
                </DataGridTextColumn.ElementStyle> 
 
                <DataGridTextColumn.EditingElementStyle> 
 
                    <Style TargetType="TextBox"> 
 
                        <Setter Property="Foreground" Value="White"/> 
 
                        <Setter Property="Background" Value="Gray"/> 
 
                        <Setter Property="BorderBrush" Value="Navy"/> 
 
                        <Setter Property="BorderThickness" Value="2"/> 
 
                    </Style> 
 
                </DataGridTextColumn.EditingElementStyle> 
 
            </DataGridTextColumn> 

结果:

image

2:设置DataGridComboBoxColumn

OK,虽然DataGridComboBoxColumn没有继承与DataGridBoundColumn,但是它和DataGridBoundColumn一样,同样有ElementStyle和EditingElementStyle这两个属性。当然对于DataGridComboBoxColumn,显然样式都要针对ComboBox的,使用上则和上面讲的的一样。

3:设置DataGridTemplateColumn

对于DataGridTemplateColumn,显然CellTemplate就是该列的普通显示样式了。对于编辑样式则可以使用EditingCellTemplate属性。

再重新定义下XAML:

<DataGridTemplateColumn Header="分数" 
 
                                   Width="2*"> 
 
                <DataGridTemplateColumn.CellTemplate> 
 
                    <DataTemplate> 
 
                        <ProgressBar Value="{Binding Score}"/> 
 
                    </DataTemplate> 
 
                </DataGridTemplateColumn.CellTemplate> 
 
                <DataGridTemplateColumn.CellEditingTemplate> 
 
                    <DataTemplate> 
 
                        <StackPanel> 
 
                            <TextBlock Text="{Binding Score}" 
 
                                      TextAlignment="Center"/> 
 
                            <Slider Value="{Binding Score,UpdateSourceTrigger=PropertyChanged}" 
 
                                   Maximum="100"/> 
 
                        </StackPanel> 
 
                    </DataTemplate> 
 
                </DataGridTemplateColumn.CellEditingTemplate> 
 
            </DataGridTemplateColumn> 
原文地址:https://www.cnblogs.com/xietianjiao/p/14978831.html