邓老五 發表於 2025-7-18 19:57:00

WPF开发中实现DataGrid中的数据分页显示,自定义分页样式

<h1 id="实际开发中我们可能需要自己写一些自定义的分页设计所以我们需要学会自己封装一个可以直接套用的分页控件以下就是一个完整的用例话不多说我们直接上代码实现">实际开发中,我们可能需要自己写一些自定义的分页设计,所以我们需要学会自己封装一个可以直接套用的分页控件,以下就是一个完整的用例,话不多说,我们直接上代码实现。</h1>
<h2 id="1新建一个分页控件viewpaginationcontrol">1.新建一个分页控件View:PaginationControl</h2>
<h3 id="11-ui展示如下">1.1 UI展示如下</h3>
<pre><code>&lt;UserControl x:Class="WPFDemoMVVM.Controls.PaginationControl"
                       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                       xmlns:local="clr-namespace:WPFDemoMVVM.Controls"
                       xmlns:cov="clr-namespace:WPFDemoMVVM.Converters"
                       xmlns:lang="clr-namespace:WPFDemoMVVM.Resources"
                       xmlns:lex="http://wpflocalizeextension.codeplex.com"
                       lex:ResxLocalizationProvider.DefaultAssembly="WPFDemoMVVM"
                       lex:ResxLocalizationProvider.DefaultDictionary="Lang"
                       lex:LocalizeDictionary.DesignCulture="zh-CN"
                       mc:Ignorable="d"
                       d:DesignHeight="30" d:DesignWidth="600" Height="30" Width="780" x:Name="Pagination" &gt;
        &lt;UserControl.Resources&gt;
                &lt;Style x:Key="PgBaseButtonStyle" TargetType="Button" &gt;
                        &lt;Setter Property="Template"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;ControlTemplate TargetType="Button"&gt;
                                                &lt;Border CornerRadius="6"
                                                       Background="{TemplateBinding Background}"
                                                       BorderBrush="{TemplateBinding BorderBrush}"
                                                       BorderThickness="{TemplateBinding BorderThickness}"&gt;
                                                        &lt;Grid&gt;
                                                                &lt;ContentPresenter HorizontalAlignment="Center"
                                                           VerticalAlignment="Center"
                                                           Content="{TemplateBinding Content}"/&gt;
                                                        &lt;/Grid&gt;
                                                &lt;/Border&gt;
                                        &lt;/ControlTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                        &lt;Setter Property="Background" Value="#282B3B"/&gt;
                        &lt;Setter Property="BorderBrush" Value="#367AFF"/&gt;
                        &lt;Setter Property="BorderThickness" Value="1"/&gt;
                        &lt;Setter Property="Foreground" Value="White"/&gt;
                        &lt;Setter Property="Padding" Value="0"/&gt;
                        &lt;Setter Property="Height" Value="30"/&gt;
                        &lt;Setter Property="Width" Value="70"/&gt;
                        &lt;Setter Property="FontSize" Value="14"/&gt;
                        &lt;Setter Property="VerticalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="VerticalContentAlignment" Value="Center"/&gt;
                        &lt;Setter Property="HorizontalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="HorizontalContentAlignment" Value="Center"/&gt;
                        &lt;Setter Property="Margin" Value="5 0"/&gt;
                        &lt;Style.Triggers&gt;
                                &lt;Trigger Property="IsMouseOver" Value="True"&gt;
                                        &lt;Setter Property="Foreground" Value="White"/&gt;
                                        &lt;Setter Property="BorderThickness" Value="2"/&gt;
                                        &lt;Setter Property="Cursor" Value="Hand"/&gt;
                                        &lt;Setter Property="Opacity" Value="1"/&gt;
                                &lt;/Trigger&gt;
                        &lt;/Style.Triggers&gt;
                &lt;/Style&gt;

                &lt;Style x:Key="PgComBoxStyle" TargetType="ComboBox"&gt;
                        &lt;Setter Property="Background" Value="#0D0D19"/&gt;
                        &lt;Setter Property="FontSize" Value="14"/&gt;
                        &lt;Setter Property="Margin" Value="20,0,0,0"/&gt;
                        &lt;Setter Property="Height" Value="32"/&gt;
                        &lt;Setter Property="Width" Value="80"/&gt;
                        &lt;Setter Property="VerticalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="HorizontalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="BorderBrush" Value="#367AFF"/&gt;
                        &lt;Setter Property="BorderThickness" Value="0"/&gt;
                        &lt;Setter Property="FontFamily" Value="Arial"/&gt;
                &lt;/Style&gt;


                &lt;Style TargetType="TextBlock" x:Key="BaseTextBlockStyle"&gt;
                        &lt;Setter Property="FontSize" Value="14"/&gt;
                        &lt;Setter Property="FontFamily" Value="Arial"/&gt;
                        &lt;Setter Property="FontWeight" Value="Normal"/&gt;
                        &lt;Setter Property="Opacity" Value="1"/&gt;
                        &lt;Setter Property="Background" Value="{x:Null}"/&gt;
                        &lt;Setter Property="Foreground" Value="White"/&gt;
                        &lt;Setter Property="VerticalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="HorizontalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="Padding" Value="0"/&gt;
                &lt;/Style&gt;

                &lt;Style x:Key="BaseComboBoxStyle" TargetType="ComboBox"&gt;
                        &lt;Setter Property="Foreground" Value="White"/&gt;
                        &lt;Setter Property="Background" Value="#0D0D19"/&gt;
                        &lt;Setter Property="BorderThickness" Value="0"/&gt;
                        &lt;Setter Property="FontSize" Value="14"/&gt;
                        &lt;Setter Property="FontFamily" Value="Arial"/&gt;
                        &lt;Setter Property="Width" Value="80"/&gt;
                        &lt;Setter Property="Height" Value="32"/&gt;
                        &lt;Setter Property="FontSize" Value="14"/&gt;
                        &lt;Setter Property="HorizontalAlignment" Value="Right"/&gt;
                        &lt;Setter Property="VerticalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="Margin" Value="5,0,5,0"/&gt;
                        &lt;Setter Property="IsEditable" Value="False"/&gt;
                        &lt;Setter Property="ItemTemplate"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;DataTemplate&gt;
                                                &lt;TextBlock Text="{Binding}" Style="{StaticResource BaseTextBlockStyle}" HorizontalAlignment="Center"/&gt;
                                        &lt;/DataTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                        &lt;Setter Property="Template"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;ControlTemplate TargetType="ComboBox"&gt;
                                                &lt;Grid&gt;
                                                        &lt;ToggleButton
                                                                        Name="ToggleButton"
                                                                        IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                                                                        ClickMode="Press"
                                                                        Background="{TemplateBinding Background}"
                                                                        BorderThickness="{TemplateBinding BorderThickness}" Width="{TemplateBinding Width}"&gt;
                                                                &lt;Grid&gt;
                                                                        &lt;ContentPresenter
                                                                                Name="ContentSite"
                                                                                IsHitTestVisible="False"
                                                                                Content="{TemplateBinding SelectionBoxItem}"
                                                                                ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                                                                                VerticalAlignment="Center"
                                                                                HorizontalAlignment="Left" Width="60"
                                                                                Margin="5,0,0,0"
                                                                                RecognizesAccessKey="True"/&gt;
                                                                        &lt;Path
                                                                                HorizontalAlignment="Right"
                                                                                Margin="0,0,6,0"
                                                                                VerticalAlignment="Center"
                                                                                Data="M 0 0 L 4 4 L 8 0 Z"
                                                                                Fill="White"/&gt;
                                                                &lt;/Grid&gt;
                                                        &lt;/ToggleButton&gt;
                                                        &lt;Popup
                                                                Name="Popup"
                                                                Placement="Bottom"
                                                                IsOpen="{TemplateBinding IsDropDownOpen}"
                                                                AllowsTransparency="True"
                                                                Focusable="False"
                                                                PopupAnimation="Slide"&gt;
                                                                &lt;Grid
                                                                        Name="DropDown"
                                                                        SnapsToDevicePixels="True"
                                                                        MinWidth="{TemplateBinding ActualWidth}"
                                                                        MaxHeight="200"
                                                                        Background="#0D0D19"&gt;
                                                                        &lt;Border x:Name="DropDownBorder" BorderThickness="0" Background="#0D0D19"/&gt;
                                                                        &lt;ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"&gt;
                                                                                &lt;StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /&gt;
                                                                        &lt;/ScrollViewer&gt;
                                                                &lt;/Grid&gt;
                                                        &lt;/Popup&gt;
                                                &lt;/Grid&gt;
                                                &lt;ControlTemplate.Triggers&gt;
                                                        &lt;Trigger Property="HasItems" Value="false"&gt;
                                                                &lt;Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/&gt;
                                                        &lt;/Trigger&gt;
                                                        &lt;Trigger Property="IsEnabled" Value="false"&gt;
                                                                &lt;Setter Property="Foreground" Value="Gray"/&gt;
                                                        &lt;/Trigger&gt;
                                                        &lt;Trigger Property="IsMouseOver" Value="True"&gt;
                                                                &lt;Setter Property="Background" Value="#1A1A2A"/&gt;
                                                        &lt;/Trigger&gt;
                                                &lt;/ControlTemplate.Triggers&gt;
                                        &lt;/ControlTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                &lt;/Style&gt;

                &lt;Style TargetType="TextBox" x:Key="BaseTextBoxStyle"&gt;
                        &lt;Setter Property="Height" Value="32"/&gt;
                        &lt;Setter Property="Width" Value="98"/&gt;
                        &lt;Setter Property="FontSize" Value="14"/&gt;
                        &lt;Setter Property="FontFamily" Value="Arial"/&gt;
                        &lt;Setter Property="FontWeight" Value="Normal"/&gt;
                        &lt;Setter Property="Opacity" Value="0.8"/&gt;
                        &lt;Setter Property="Background" Value="#0C0E1A"/&gt;
                        &lt;Setter Property="Foreground" Value="White"/&gt;
                        &lt;Setter Property="BorderThickness" Value="0"/&gt;
                        &lt;Setter Property="Padding" Value="0"/&gt;
                        &lt;Setter Property="VerticalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="HorizontalAlignment" Value="Center"/&gt;
                        &lt;Setter Property="VerticalContentAlignment" Value="Center"/&gt;
                        &lt;Setter Property="HorizontalContentAlignment" Value="Left"/&gt;
                        &lt;!-- 设置光标颜色为白色 --&gt;
                        &lt;Setter Property="CaretBrush" Value="White"/&gt;

                        &lt;!--&lt;Style.Triggers&gt;
                       &lt;Trigger Property="IsMouseOver" Value="True"&gt;
                               &lt;Setter Property="Foreground" Value="White"/&gt;
                               &lt;Setter Property="Cursor" Value="Hand"/&gt;
                       &lt;/Trigger&gt;
               &lt;/Style.Triggers&gt;--&gt;
                &lt;/Style&gt;


                &lt;cov:FormatStringMultiConverter x:Key="FormatStringMultiConverter"/&gt;
        &lt;/UserControl.Resources&gt;


        &lt;StackPanel Orientation="Horizontal" HorizontalAlignment="Center"&gt;
                &lt;Button Content="{lex:Loc HomePage}" Command="{Binding FirstPageCommand}"Style="{DynamicResource ResourceKey=PgBaseButtonStyle}"/&gt;
                &lt;Button Content="{lex:Loc PrevPage}" Command="{Binding PrevPageCommand}" Style="{DynamicResource ResourceKey=PgBaseButtonStyle}" /&gt;
                &lt;TextBlock Margin="10,0" Text="{Binding PageStatus}" Style="{DynamicResource ResourceKey=BaseTextBlockStyle}" Width="auto" FontSize="14"/&gt;
                &lt;Button Content="{lex:Loc NextPage}" Command="{Binding NextPageCommand}" Style="{DynamicResource ResourceKey=PgBaseButtonStyle}"/&gt;
                &lt;Button Content="{lex:Loc LastPage}" Command="{Binding LastPageCommand}" Style="{DynamicResource ResourceKey=PgBaseButtonStyle}"/&gt;
                &lt;TextBlock Text="{lex:Loc PageSize}" VerticalAlignment="Center" Style="{DynamicResource ResourceKey=BaseTextBlockStyle}" FontSize="14"/&gt;
                &lt;ComboBox ItemsSource="{Binding PageSizeOptions, Mode=OneWay}" SelectedItem="{Binding PageSize,Mode=TwoWay}" Style="{DynamicResource BaseComboBoxStyle}"/&gt;
                &lt;TextBlock Text="{lex:Loc Total}" VerticalAlignment="Center" Style="{DynamicResource ResourceKey=BaseTextBlockStyle}" Margin="5" FontSize="14"/&gt;
                &lt;TextBox Text="{Binding TotalItems}" Style="{DynamicResource ResourceKey=BaseTextBoxStyle}" IsEnabled="False"&gt;&lt;/TextBox&gt;
        &lt;/StackPanel&gt;
&lt;/UserControl&gt;
</code></pre>
<h3 id="12-分页控件的viewmodel">1.2 分页控件的ViewModel:</h3>
<pre><code>public partial class PagingViewModel : ObservableObject
{
        public PagingViewModel()
        {
                PageSizeOptions = new ObservableCollection&lt;int&gt; { 10, 20, 50 };
                PageSize = 10;
                CurrentPage = 1;
                Language = "zh-CN";
        }

       
        private int currentPage;

       
        private int pageSize;

       
        private int totalItems;

       
        private string language;

       
        private ObservableCollection&lt;int&gt; pageSizeOptions;

        public int TotalPages =&gt; PageSize == 0 ? 1 : (int)Math.Ceiling((double)TotalItems / PageSize);
        public string PageStatus =&gt; Language == "zh-CN" ? $"第 {CurrentPage} / {TotalPages} 页" : $"page {CurrentPage} of {TotalPages}";

        // 每当这些属性改变时,通知依赖属性的更新
        partial void OnCurrentPageChanged(int value)
        {
                OnPropertyChanged(nameof(PageStatus));
        }

        partial void OnPageSizeChanged(int value)
        {
                CurrentPage = 1;
                OnPropertyChanged(nameof(TotalPages));
                OnPropertyChanged(nameof(PageStatus));
                GoToPage(CurrentPage);
        }

        partial void OnTotalItemsChanged(int value)
        {
                OnPropertyChanged(nameof(TotalPages));
                OnPropertyChanged(nameof(PageStatus));
        }

        partial void OnLanguageChanged(string value)
        {
                OnPropertyChanged(nameof(PageStatus));
        }

       
        private void FirstPage() =&gt; GoToPage(1);

       
        private void PrevPage() =&gt; GoToPage(Math.Max(1, CurrentPage - 1));

       
        private void NextPage() =&gt; GoToPage(Math.Min(TotalPages, CurrentPage + 1));

       
        private void LastPage() =&gt; GoToPage(TotalPages);

        private void GoToPage(int page)
        {
                CurrentPage = page;
                PageChanged?.Invoke(CurrentPage, PageSize);
        }

        public event Action&lt;int, int&gt; PageChanged;
}
</code></pre>
<h2 id="2datagrid-界面展示如下">2.DataGrid 界面展示如下:</h2>
<h3 id="21-ui展示效果如下">2.1 UI展示效果如下:</h3>
<pre><code>&lt;Window x:Class="WPFDemoMVVM.View.DataGridView"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                xmlns:local="clr-namespace:WPFDemoMVVM.View"
                xmlns:hr="clr-namespace:WPFDemoMVVM.Helpers"
                xmlns:be="clr-namespace:WPFDemoMVVM.Behaviors"
                xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
                xmlns:pg="clr-namespace:WPFDemoMVVM.Controls"
                xmlns:lang="clr-namespace:WPFDemoMVVM.Resources"
                xmlns:lex="http://wpflocalizeextension.codeplex.com"
                lex:ResxLocalizationProvider.DefaultAssembly="WPFDemoMVVM"
                lex:ResxLocalizationProvider.DefaultDictionary="Lang"
                lex:LocalizeDictionary.DesignCulture="zh-CN"
                mc:Ignorable="d"
                Title="DataGridView" Height="600" Width="800"&gt;
        &lt;Window.Resources&gt;
                &lt;CollectionViewSource x:Key="view" Filter="CollectionViewSource_Filter"/&gt;


                &lt;!--datagrid样式--&gt;
                &lt;Style x:Key="DataGridStyleCommon" TargetType="DataGrid"&gt;
                        &lt;Setter Property="RowHeight" Value="40"/&gt;
                        &lt;Setter Property="Background"Value="#191D2A" /&gt;
                        &lt;Setter Property="BorderBrush"Value="{x:Null}" /&gt;
                        &lt;Setter Property="Foreground" Value="White"/&gt;
                        &lt;Setter Property="Opacity" Value="1"/&gt;
                        &lt;!--该属性指示是否允许用户调整列宽度--&gt;
                        &lt;Setter Property="CanUserResizeColumns"   Value="false" /&gt;
                        &lt;!--网格线颜色--&gt;
                        &lt;Setter Property="VerticalGridLinesBrush" Value="{x:Null}"/&gt;
                        &lt;Setter Property="IsReadOnly" Value="True"&gt;&lt;/Setter&gt;
                        &lt;Setter Property="HorizontalGridLinesBrush"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;SolidColorBrush Color="#10FFFFFF" /&gt;
                                        &lt;!--网格透明度--&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                        &lt;!--&lt;Setter Property="VerticalGridLinesBrush"&gt;
               &lt;Setter.Value&gt;
                       &lt;SolidColorBrush Color="#FFEA8777" /&gt;
               &lt;/Setter.Value&gt;
       &lt;/Setter&gt;--&gt;
                        &lt;!--表格字段显示手动完成--&gt;
                        &lt;Setter Property="AutoGenerateColumns" Value="False"&gt;&lt;/Setter&gt;
                        &lt;!--隔行换色 --&gt;
                        &lt;Setter Property="AlternationCount" Value="3"&gt;&lt;/Setter&gt;
                        &lt;!--DataGrid控件模板--&gt;
                        &lt;Setter Property="Template"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;ControlTemplate TargetType="{x:Type DataGrid}"&gt;
                                                &lt;Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" x:Name="border"
                                               Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"&gt;
                                                        &lt;ScrollViewer x:Name="DG_ScrollViewer" Focusable="false"&gt;
                                                                &lt;ScrollViewer.Template&gt;
                                                                        &lt;ControlTemplate TargetType="{x:Type ScrollViewer}"&gt;
                                                                                &lt;Grid&gt;
                                                                                        &lt;Grid.ColumnDefinitions&gt;
                                                                                                &lt;ColumnDefinition x:Name="col_rowheader" Width="1" /&gt;
                                                                                                &lt;ColumnDefinition Width="*" /&gt;
                                                                                                &lt;ColumnDefinition Width="Auto" /&gt;
                                                                                        &lt;/Grid.ColumnDefinitions&gt;
                                                                                        &lt;Grid.RowDefinitions&gt;
                                                                                                &lt;RowDefinition Height="Auto" /&gt;
                                                                                                &lt;RowDefinition Height="*" /&gt;
                                                                                                &lt;RowDefinition Height="Auto" /&gt;
                                                                                        &lt;/Grid.RowDefinitions&gt;
                                                                                        &lt;!--选中所有行--&gt;
                                                                                        &lt;Button Command="ApplicationCommands.SelectAll" Focusable="False" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}}"&gt;
                                                                                                &lt;Button.Visibility&gt;
                                                                                                        &lt;Binding Path="HeadersVisibility" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}"&gt;
                                                                                                                &lt;Binding.ConverterParameter&gt;
                                                                                                                        &lt;DataGridHeadersVisibility&gt;All&lt;/DataGridHeadersVisibility&gt;
                                                                                                                &lt;/Binding.ConverterParameter&gt;
                                                                                                        &lt;/Binding&gt;
                                                                                                &lt;/Button.Visibility&gt;
                                                                                        &lt;/Button&gt;
                                                                                        &lt;!--表格头部--&gt;
                                                                                        &lt;DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Grid.ColumnSpan="2"
                                                                                               Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" &gt;
                                                                                        &lt;/DataGridColumnHeadersPresenter&gt;
                                                                                        &lt;!--主数据区--&gt;
                                                                                        &lt;Grid Grid.Row="1" Grid.ColumnSpan="2"&gt;
                                                                                                &lt;ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" /&gt;
                                                                                        &lt;/Grid&gt;
                                                                                        &lt;!--垂直滑动条--&gt;

                                                                                        &lt;ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}"
                                                                                                Orientation="Vertical" Grid.Row="0" Grid.RowSpan="3" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                                                                                                Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
                                                                                                ViewportSize="{TemplateBinding ViewportHeight}" /&gt;

                                                                                        &lt;!--横向滑动条--&gt;
                                                                                        &lt;!--
                                                                       &lt;ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2"
                                                                                                        Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal"
                                                                                                        Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                                                                                        Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
                                                                                                        ViewportSize="{TemplateBinding ViewportWidth}" /&gt;--&gt;
                                                                                &lt;/Grid&gt;
                                                                        &lt;/ControlTemplate&gt;
                                                                &lt;/ScrollViewer.Template&gt;
                                                                &lt;ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /&gt;
                                                        &lt;/ScrollViewer&gt;
                                                &lt;/Border&gt;
                                                &lt;ControlTemplate.Triggers&gt;
                                                        &lt;Trigger Property="IsEnabled" Value="false"&gt;
                                                                &lt;Setter Property="Opacity" Value="1" TargetName="border" /&gt;
                                                        &lt;/Trigger&gt;
                                                &lt;/ControlTemplate.Triggers&gt;
                                        &lt;/ControlTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                        &lt;Style.Triggers&gt;
                                &lt;Trigger Property="IsGrouping" Value="true"&gt;
                                        &lt;Setter Property="ScrollViewer.CanContentScroll" Value="false" /&gt;
                                &lt;/Trigger&gt;
                        &lt;/Style.Triggers&gt;

                &lt;/Style&gt;

                &lt;!--行头部样式--&gt;
                &lt;Style x:Key="DataGridRowHeaderStyleCommon" TargetType="DataGridRowHeader"&gt;
                        &lt;Setter Property="HorizontalContentAlignment" Value="Stretch" /&gt;
                        &lt;Setter Property="VerticalContentAlignment" Value="Center" /&gt;
                        &lt;Setter Property="Background" Value="Transparent" /&gt;
                        &lt;Setter Property="BorderBrush" Value="{x:Null}" /&gt;
                        &lt;Setter Property="BorderThickness" Value="1" /&gt;
                        &lt;Setter Property="Margin" Value="0,0,0,0" /&gt;
                        &lt;Setter Property="Template"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;ControlTemplate TargetType="{x:Type DataGridRowHeader}"&gt;
                                                &lt;Grid&gt;
                                                        &lt;Border BorderBrush="{TemplateBinding BorderBrush}"
                                                        Background="{TemplateBinding Background}"
                                                        BorderThickness="{TemplateBinding BorderThickness}"
                                                        Padding="{TemplateBinding Padding}"
                                                        Margin="{TemplateBinding Margin}"
                                                        SnapsToDevicePixels="True"&gt;
                                                                &lt;ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/&gt;
                                                        &lt;/Border&gt;
                                                &lt;/Grid&gt;
                                        &lt;/ControlTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                &lt;/Style&gt;

                &lt;!--标题栏 列头部样式--&gt;
                &lt;Style x:Key="DataGridColumnHeaderStyleCommon" TargetType="DataGridColumnHeader"&gt;
                        &lt;Setter Property="SnapsToDevicePixels" Value="True" /&gt;
                        &lt;Setter Property="MinWidth" Value="15" /&gt;
                        &lt;Setter Property="MinHeight" Value="28" /&gt;
                        &lt;!--&lt;Setter Property="Foreground" Value="#FF0FA459" /&gt;--&gt;
                        &lt;Setter Property="Foreground" Value="{DynamicResource textBoxWhiteColor}" /&gt;
                        &lt;Setter Property="FontSize"   Value="14" /&gt;
                        &lt;!--&lt;Setter Property="Cursor"   Value="Hand" /&gt;--&gt;
                        &lt;Setter Property="Height" Value="30" /&gt;
                        &lt;Setter Property="Template"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;ControlTemplate TargetType="DataGridColumnHeader"&gt;
                                                &lt;!--设置表头的背景等样式--&gt;
                                                &lt;Border x:Name="BackgroundBorder"Background="{DynamicResource backgroundGrayColor}"   BorderThickness="0"   BorderBrush="{DynamicResource borderBrushCommonColor}"Width="Auto"&gt;
                                                        &lt;Grid&gt;
                                                                &lt;Grid.ColumnDefinitions&gt;
                                                                        &lt;ColumnDefinition Width="*" /&gt;
                                                                &lt;/Grid.ColumnDefinitions&gt;
                                                                &lt;!--内容--&gt;
                                                                &lt;ContentPresenterMargin="0,0,0,0"VerticalAlignment="Center"HorizontalAlignment="Center" /&gt;
                                                                &lt;!--排序图标--&gt;
                                                                &lt;Path x:Name="SortArrow"Visibility="Collapsed"   Data="M0,0 L1,0 0.5,1 z"Stretch="Fill"    Grid.Column="2"   
                                                                   Width="8"Height="6"Fill="{DynamicResource textBoxWhiteColor}" Margin="0,0,50,0"VerticalAlignment="Center"RenderTransformOrigin="1,1" /&gt;
                                                                &lt;!--分割线--&gt;
                                                                &lt;Rectangle Visibility="Collapsed"Width="1" Fill="#d6c79b" HorizontalAlignment="Right"Grid.ColumnSpan="1"   /&gt;
                                                        &lt;/Grid&gt;
                                                &lt;/Border&gt;
                                        &lt;/ControlTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                &lt;/Style&gt;


                &lt;!--行样式触发--&gt;
                &lt;!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式--&gt;
                &lt;Style x:Key="DataGridRowStyleCommon"TargetType="DataGridRow"&gt;
                        &lt;Setter Property="Background"Value="#0D0D19"/&gt;
                        &lt;Setter Property="Height"Value="40" /&gt;
                        &lt;Setter Property="Foreground" Value="White" /&gt;
                        &lt;Style.Triggers&gt;
                                &lt;!--隔行换色--&gt;
                                &lt;!--&lt;Trigger Property="AlternationIndex"Value="0"&gt;
                        &lt;Setter Property="Background"   Value="{x:Null}" /&gt;
                &lt;/Trigger&gt;--&gt;
                                &lt;!--&lt;Trigger Property="AlternationIndex"   Value="1"&gt;
                        &lt;Setter Property="Background" Value="#FFD4C9F9" /&gt;
                &lt;/Trigger&gt;
                &lt;Trigger Property="AlternationIndex"   Value="2"&gt;
                        &lt;Setter Property="Background" Value="#FFFFCFC7" /&gt;
                &lt;/Trigger&gt;--&gt;
                                &lt;Trigger Property="IsMouseOver"   Value="True"&gt;
                                        &lt;Setter Property="Foreground" Value="White"/&gt;
                                        &lt;Setter Property="Background"Value="#191D2A" /&gt;
                                        &lt;Setter Property="Cursor" Value="Hand"/&gt;
                                        &lt;Setter Property="Opacity" Value="0.6"&gt;&lt;/Setter&gt;
                                &lt;/Trigger&gt;
                                &lt;Trigger Property="IsSelected" Value="True"&gt;
                                        &lt;!--&lt;Setter Property="Foreground"   Value="#FFF31006" /&gt;--&gt;
                                        &lt;Setter Property="Opacity" Value="1"&gt;&lt;/Setter&gt;
                                        &lt;Setter Property="Background" Value="#1D1D2A"/&gt;
                                &lt;/Trigger&gt;
                        &lt;/Style.Triggers&gt;
                &lt;/Style&gt;

                &lt;!--单元格样式触发--&gt;
                &lt;Style x:Key="DataGridCellStyleCommon" TargetType="DataGridCell"&gt;
                        &lt;Setter Property="Template"&gt;
                                &lt;Setter.Value&gt;
                                        &lt;ControlTemplate TargetType="DataGridCell"&gt;
                                                &lt;TextBlock TextAlignment="Center"VerticalAlignment="Center"&gt;   
                                        &lt;ContentPresenter /&gt;
                                                &lt;/TextBlock&gt;
                                        &lt;/ControlTemplate&gt;
                                &lt;/Setter.Value&gt;
                        &lt;/Setter&gt;
                        &lt;Style.Triggers&gt;
                                &lt;Trigger Property="IsSelected" Value="True"&gt;
                                        &lt;Setter Property="Foreground" Value="White" /&gt;
                                        &lt;Setter Property="FontWeight" Value="Bold"/&gt;
                                &lt;/Trigger&gt;
                                &lt;Trigger Property="IsMouseOver" Value="True"&gt;
                                        &lt;Setter Property="Foreground" Value="White"/&gt;
                                &lt;/Trigger&gt;
                        &lt;/Style.Triggers&gt;
                &lt;/Style&gt;

        &lt;/Window.Resources&gt;
        &lt;Grid&gt;
                &lt;Grid.RowDefinitions&gt;
                        &lt;RowDefinition/&gt;
                        &lt;RowDefinition Height="40"/&gt;
                        &lt;RowDefinition Height="80"/&gt;
                &lt;/Grid.RowDefinitions&gt;
                &lt;Grid Grid.Row="0" Height="500" Width="auto"&gt;
                        &lt;DataGrid Name="userInfoGrid"AutoGenerateColumns="False" Height="440" HorizontalAlignment="Left" HorizontalContentAlignment="Center" VerticalAlignment="Top" IsReadOnly="True" CanUserAddRows="False" VerticalScrollBarVisibility="Auto" EnableRowVirtualization="False"                                 
                                Style="{DynamicResource ResourceKey=DataGridStyleCommon}"
                                   RowHeaderStyle="{DynamicResource ResourceKey=DataGridRowHeaderStyleCommon}"                  
                                   ColumnHeaderStyle="{DynamicResource ResourceKey=DataGridColumnHeaderStyleCommon}"                  
                                   RowStyle="{DynamicResource ResourceKey=DataGridRowStyleCommon}"                  
                                   CellStyle="{DynamicResource ResourceKey=DataGridCellStyleCommon}" Margin="2 0 5 0" BorderThickness="1" ItemsSource="{Binding CollectionView,Mode=OneWay}"
                                                  hr:MultiSelectorHelper.MonitorSelectionChanged="True"
hr:MultiSelectorHelper.BindableSelectedItems="{Binding SelectedItems,Mode=OneWayToSource}"
                                                  &gt;

                                &lt;i:Interaction.Behaviors&gt;
                                        &lt;be:SelectedItemsBehavior BindableSelectedItems="{Binding SelectedItems,Mode=OneWayToSource}"/&gt;
                                &lt;/i:Interaction.Behaviors&gt;
                                &lt;DataGrid.Columns&gt;
                                        &lt;DataGridTextColumn Binding="{Binding Index}" CanUserSort="False" IsReadOnly="True" Width="50"&gt;
                                                &lt;DataGridTextColumn.HeaderTemplate&gt;
                                                        &lt;DataTemplate&gt;
                                                                &lt;TextBlock Text="{lex:Loc Number}"/&gt;
                                                        &lt;/DataTemplate&gt;
                                                &lt;/DataGridTextColumn.HeaderTemplate&gt;
                                        &lt;/DataGridTextColumn&gt;
                                        &lt;DataGridTextColumn Binding="{Binding Name}" CanUserSort="False" IsReadOnly="True" Width="*"&gt;
                                                &lt;DataGridTextColumn.HeaderTemplate&gt;
                                                        &lt;DataTemplate&gt;
                                                                &lt;TextBlock Text="{lex:Loc AccountName}"/&gt;
                                                        &lt;/DataTemplate&gt;
                                                &lt;/DataGridTextColumn.HeaderTemplate&gt;
                                        &lt;/DataGridTextColumn&gt;
                                        &lt;DataGridTextColumn Binding="{Binding Salary}" CanUserSort="False" IsReadOnly="True" Width="*"&gt;
                                                &lt;DataGridTextColumn.HeaderTemplate&gt;
                                                        &lt;DataTemplate&gt;
                                                                &lt;TextBlock Text="{lex:Loc Salary}"/&gt;
                                                        &lt;/DataTemplate&gt;
                                                &lt;/DataGridTextColumn.HeaderTemplate&gt;
                                        &lt;/DataGridTextColumn&gt;
                                &lt;/DataGrid.Columns&gt;
                        &lt;/DataGrid&gt;
                &lt;/Grid&gt;

                &lt;pg:PaginationControl x:Name="pageControl" Grid.Row="1" DataContext="{Binding Pagination}" VerticalAlignment="Bottom" Background="#191D2A" Height="40"&gt;
                &lt;/pg:PaginationControl&gt;
                &lt;StackPanel Grid.Row="2" Orientation="Horizontal"&gt;

                        &lt;!--&lt;TextBox x:Name="queryKeyword"Width="200" Height="50" TextChanged="queryKeyword_TextChanged"/&gt;--&gt;
                        &lt;TextBlock Text="{lex:Loc AccountName}" Style="{DynamicResource TextBlockBaseStyle}" Margin="5"/&gt;
                        &lt;TextBox x:Name="queryKeyword" Text="{Binding QueryKeyword,UpdateSourceTrigger=PropertyChanged}" Width="200" Height="32" Margin="5"/&gt;
                        &lt;Button Margin="5" Content="{lex:Loc Add}" Command="{Binding AddCommand}"/&gt;
                        &lt;Button Margin="5" Content="{lex:Loc Delete}" Command="{Binding DeleteCommand}"/&gt;
                        &lt;Button Margin="5" Content="{lex:Loc Calculate}" Command="{Binding CalculateSumSalaryCommand}" CommandParameter="{Binding ElementName=userInfoGrid,Path=SelectedItems}"/&gt;
                        &lt;TextBox Text="{Binding TotalSalary}" Width="200" Height="32" Margin="5"/&gt;
                &lt;/StackPanel&gt;

        &lt;/Grid&gt;
&lt;/Window&gt;
</code></pre>
<h3 id="22-实现viewmodel业务逻辑如下">2.2 实现Viewmodel业务逻辑如下:</h3>
<pre><code>public partial class DataGridViewModel :ObservableObject
{

        public List&lt;EmployeeModel&gt; employees;

       
        ICollectionView collectionView;

       
        string queryKeyword;

       
        IList selectedItems;

       
        private double totalSalary;

       
        public PagingViewModel pagination;

        public DataGridViewModel()
        {
                Pagination = new PagingViewModel();
                Pagination.PageChanged += OnPageChanged;
                ChangeLanguage("zh-CN");
                IEnumerable&lt;EmployeeModel&gt; employees =EmployeeModel.FakeMany(10);
                this.employees = new List&lt;EmployeeModel&gt;(employees);

                var pageData = this.employees
                        .Skip((Pagination.CurrentPage - 1) * Pagination.PageSize)
                        .Take(Pagination.PageSize)
                        .Select((e, i) =&gt;
                        {
                                e.Index = (Pagination.CurrentPage - 1) * Pagination.PageSize + i + 1;
                                return e;
                        }).ToList();

                CollectionView = CollectionViewSource.GetDefaultView(pageData);
                Pagination.TotalItems = this.employees.Count;
        }


        partial void OnQueryKeywordChanged(string value)
        {
                Pagination.CurrentPage = 1; // 筛选后回到第一页
                OnPageChanged(Pagination.CurrentPage, Pagination.PageSize);
        }


        private void OnPageChanged(int currentPage, int pageSize)
        {
                var filtered = employees.Where(e =&gt; string.IsNullOrEmpty(QueryKeyword) || e.Name.Contains(QueryKeyword, StringComparison.OrdinalIgnoreCase)).ToList();
                Pagination.TotalItems = filtered.Count;

                //重新生成索引 number从1开始
                var pageData = filtered
                        .Skip((currentPage - 1) * pageSize)
                        .Take(pageSize)
                        .Select((e, i) =&gt;
                        {
                                e.Index = (currentPage - 1) * pageSize + i + 1;
                                return e;
                        }).ToList();

                CollectionView = CollectionViewSource.GetDefaultView(pageData);
        }

       
        private void ChangeLanguage(string languageCode)
        {
                SelectedLanguage=languageCode;
                Pagination.Language = languageCode;
                var culture = new CultureInfo(languageCode);
                Thread.CurrentThread.CurrentCulture = culture;
                Thread.CurrentThread.CurrentUICulture = culture;
                LocalizeDictionary.Instance.Culture = culture;
        }



       
        public void Add()
        {
                employees.Add(EmployeeModel.FakeOne());
                OnPageChanged(Pagination.CurrentPage, Pagination.PageSize);         
        }

       
        public void Delete()
        {
                if (SelectedItems != null)
                {
                        employees.RemoveAll(e =&gt; SelectedItems.Contains(e));
                        OnPageChanged(Pagination.CurrentPage, Pagination.PageSize);
                }         
        }

       
        public void CalculateSumSalary()
        {
                if (SelectedItems != null)
                {
                        var sum = SelectedItems.Cast&lt;EmployeeModel&gt;().Sum(x =&gt; ((EmployeeModel)x).Salary);
                        TotalSalary = sum;
                }

                foreach (var item in employees)
                {
                        item.IsSelected = item.Salary &gt; 15000;
                }
                collectionView.Refresh();
        }

}
</code></pre>
<h2 id="3运行效果如下">3.运行效果如下</h2>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202507/2212230-20250718195651522-1212191421.png"></p>
<p>源代码地址:https://gitee.com/chenshibao/wpfdemo.git</p>
<p><strong>如果本文介绍对你有帮助,可以一键四连:点赞+评论+收藏+推荐,谢谢!</strong></p><br><br>
来源:https://www.cnblogs.com/chenshibao/p/18992068
頁: [1]
查看完整版本: WPF开发中实现DataGrid中的数据分页显示,自定义分页样式