详解WPF 4 DataGrid控件的基本功能

6 篇文章 0 订阅

详解WPF 4 DataGrid控件的基本功能

提到DataGrid 不管是网页还是应用程序开发都会频繁使用。通过它我们可以灵活的在行与列间显示各种数据。本篇将详细介绍WPF 4 中DataGrid 的相关功能。

自定义列

     默认情况下,当我们为DataGrid 控件设置ItemSource 属性后,DataGrid 会根据数据类型自动生成相应的列,下表列出DataGrid 支持的四种列及其数据类型。

Column

     在创建DataGrid 时可以通过AutoGenerateColumns 属性设置列是否自动生成,从而加入自定义列。如果DataGrid 中同时包含“自动生成列”与“用户自定义列”,则首先创建“用户自定义列”。下面代码实例中分别创建这四种列:

<Window x:Class="WPF4ControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPF4ControlTest"
        xmlns:assembly="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="200" Width="500">
    <Window.Resources>
        <ObjectDataProvider x:Key="sexEnum" MethodName="GetValues" 
                            ObjectType="{x:Type assembly:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="local:SexOpt"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Width="80" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Age" Width="50" Binding="{Binding Age}"/>
                <DataGridComboBoxColumn Width="80" Header="Sex" 
                                        SelectedItemBinding="{Binding Sex}" 
                                        ItemsSource="{Binding Source={StaticResource sexEnum}}"/>
                <DataGridCheckBoxColumn Header="Pass Exam?" Width="100" 
                                        Binding="{Binding Pass}"/>
                <DataGridHyperlinkColumn Header="Email" Width="150" 
                                         Binding="{Binding Email}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

     其中每列都包含各自的数值类型,在C# 中创建Member 类及SexOpt 枚举,并将memberData 数据绑定到DataGrid:

using System;
using System.Windows;
using System.Collections.ObjectModel;

namespace WPF4ControlTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            ObservableCollection<Member> memberData = new ObservableCollection<Member>();
            memberData.Add(new Member()
            {
                Name = "Joe", Age = "23", Sex = SexOpt.Male,
                Pass = true, Email = new Uri("mailto:Joe@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "Mike", Age = "20",
                Sex = SexOpt.Male, Pass = false,
                Email = new Uri("mailto:Mike@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "Lucy", Age = "25",
                Sex = SexOpt.Female, Pass = true,
                Email = new Uri("mailto:Lucy@school.com")
            });
            dataGrid.DataContext = memberData;
        }
    }

    public enum SexOpt { Male, Female };

    public class Member
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public SexOpt Sex { get; set; }
        public bool Pass { get; set; }
        public Uri Email { get; set; }
    }
}

这样我们就可以通过自定义列的方式创建出DataGrid:

MainWindow

选择模式

     默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionModeSelectionUnit 属性来修改DataGrid 的选择模式。

DefaultMode

SelectionUnit:包含CellFullRowCellOrRowHeader 三种单元选择模式。
                         · Cell:选择单元格;
                         · FullRow:选择全行;
                         · CellOrRowHeader:可选择单元格,也可以通过点击行首选择全行;

SelectionMode:分为ExtendedSingle 两种模式。
                           · Extended:选择多个单元(单元格或全行,由SelectionUnit 定义);
                           · Single:选择唯一单元(单元格或全行,由SelectionUnit 定义);

<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False"
          SelectionUnit="Cell" SelectionMode="Extended">… …

设置SelectionUnit 和SelectionMode 后的实例效果:

ModeSample

编辑

     默认情况下,我们可以直接在DataGrid 中编辑数据(下表为相关的编辑命令),当然也可以通过IsReadOnly 属性将DataGrid 设置为只读方式。

<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False"
          SelectionUnit="Cell" SelectionMode="Extended" IsReadOnly="True">… …

Edit

其他设置

CanUserAddRowsCanUserDeleteRowsCanUserReorderColumnsCanUserResizeColumns
CanUserResizeRowsCanUserSortColumnsFrozenColumnCountDisplayIndex

作者:李敬然(Gnie)
出处: {GnieTech} (http://www.cnblogs.com/gnielee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。


WPF中设置DataGrid的一些样式

    <Window.Resources>  
        <Style TargetType="DataGrid">  
            <!--拖动改变单元格大小-->  
            <Setter Property="CanUserResizeColumns" Value="false"/>  
            <!--网格线颜色-->  
            <Setter Property="HorizontalGridLinesBrush">  
                <Setter.Value>  
                    <SolidColorBrush Color="LightBlue"/>  
                </Setter.Value>  
            </Setter>  
            <Setter Property="VerticalGridLinesBrush">  
                <Setter.Value>  
                    <SolidColorBrush Color="LightBlue"/>  
                </Setter.Value>  
            </Setter>  
        </Style>  
      
        <!--标题栏样式-->  
        <Style  TargetType="DataGridColumnHeader" >  
            <Setter Property="Width" Value="50"/>  
            <Setter Property="FontSize" Value="14" />  
            <Setter Property="Background" Value="lightBlue" />  
            <!--加粗-->  
            <Setter  Property="FontWeight"  Value="Bold"/>  
        </Style>  
      
        <!--行样式触发-->  
        <!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式-->  
        <Style  TargetType="DataGridRow">  
            <Style.Triggers>  
                <Trigger Property="IsSelected" Value="True">  
                    <Setter Property="BorderBrush" Value="Red" />  
                    <Setter Property="BorderThickness" Value="1" />  
                </Trigger>  
                <Trigger Property="IsMouseOver" Value="True">  
                    <Setter Property="Background" Value="LightGray"/>  
                </Trigger>  
            </Style.Triggers>  
        </Style>  
          
        <!--单元格样式触发-->  
        <Style TargetType="DataGridCell">  
            <Style.Triggers>  
                <Trigger Property="IsSelected" Value="True">  
                    <Setter Property="Background" Value="White"/>  
                    <Setter Property="BorderThickness" Value="0"/>  
                    <Setter Property="Foreground" Value="Red"/>  
                </Trigger>  
            </Style.Triggers>  
        </Style>  
    </Window.Resources>


var tempDataGrid = sender  as  DataGrid;
             if  (tempDataGrid !=  null )
             {
                 var frameworkElement = tempDataGrid.CurrentColumn.GetCellContent(tempDataGrid.SelectedItem);
                 if  (frameworkElement !=  null )
                 {
                     string  controllerName = frameworkElement.Name;
                     if  (controllerName ==  "ControlName" )
                     {
                         
                     }
                     else
                     {
                         
                     }
                 }
             }

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF自定义DataGrid控件是通过继承现有的DataGrid类,并在其基础上进行修改和扩展来实现的。 自定义DataGrid控件的步骤如下: 1. 创建一个自定义的类,继承自DataGrid。例如,可以命名为CustomDataGrid。 2. 在CustomDataGrid类中,可以添加额外的属性、依赖属性或附加属性,用于自定义DataGrid控件的特定行为或外观。 3. 重写或扩展DataGrid的现有方法、事件和样式,以满足自定义需求。例如,可以重写OnApplyTemplate()方法以应用自定义样式。 4. 根据需要,可以添加新的功能或控件,例如自定义列、单元格、行、排序、筛选、分页等等。 5. 在CustomDataGrid类中,可以通过编写自定义的模板(Template)来修改DataGrid的外观。例如,可以通过修改DataGrid的ControlTemplate来改变整个DataGrid的显示风格。 6. 编写完自定义类后,可以在XAML中使用自定义DataGrid控件,通过添加命名空间引用并将CustomDataGrid作为一个控件使用。可以设置自定义属性、事件和样式,达到期望的效果。 通过自定义DataGrid控件,可以根据实际需求对其进行扩展和修改,以满足特定的业务需求。由于WPF提供了强大的样式、模板和继承机制,因此可以轻松地自定义DataGrid控件,并且可以实现高度的灵活性和可扩展性。这样,可以根据项目的需求和用户的喜好来创建独特的、具有个性化的DataGrid控件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值