datagrid控件是WPF中最常用的控件之一。它可以方便地展示大量的数据并帮助用户更加直观地查看数据,通过一些实用的方法和技巧,可以更好地使用datagrid控件。在这篇文章中,我们将探讨如何使用datagrid控件展示大量数据。
一、绑定数据源
绑定数据源是datagrid控件展示数据的第一步。在WPF中,可以使用一种名为“绑定”(Binding)的方法来将数据源和控件之间的连接。绑定的本质是建立控件和数据源之间的关系,控件会自动根据数据源中数据的变化而更新自己的显示内容。
首先,我们需要定义数据源。假如我们有一个类叫做Person,这个类有三个属性:Name、Age和Gender。我们可以定义一个List
```csharp
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
}
List
{
new Person() { Name = "小明", Age = 20, Gender = "Male" },
new Person() { Name = "小红", Age = 22, Gender = "Female" },
new Person() { Name = "小刚", Age = 21, Gender = "Male" },
new Person() { Name = "小娟", Age = 19, Gender = "Female" }
};
```
接下来,我们需要将数据源和datagrid控件绑定起来。在XAML中,我们可以使用DataGrid控件的ItemsSource属性将数据源绑定到控件上。
```xaml
```
这里的personList就是我们在C#中定义的数据源。通过这样的方式,我们就可以将数据源和控件连接起来,datagrid控件就可以展示我们的数据了。
二、调整列宽
当我们将数据绑定到datagrid控件之后,可能会发现某些列的宽度不适合文本的长度,造成了文本溢出或者过小的情况。为了解决这个问题,我们需要调整列的宽度。
在WPF中,datagrid控件中的列可以通过DataGridTextColumn的Width属性来控制宽度大小。通过这个属性,我们可以设置列宽为固定的值、自动调整列宽或者使用*来占满datagrid控件的全部宽度。
```xaml
```
这里我们设置了三列,第一列宽度为100,第二列宽度自动调整,第三列占据datagrid控件的全部剩余宽度(即使用“*”占满)。
三、排序数据
在datagrid控件中,我们可以通过鼠标单击表头来对数据进行升降序排列。datagrid控件提供了一个名为SortDirection的属性来控制数据的排序状态。
```xaml
```
这里我们将每一列的SortDirection属性和ViewModel中的对应属性绑定,通过控制ViewModel中的属性值来控制排序方向。
```csharp
private ListSortDirection _nameSortDirection;
private ListSortDirection _ageSortDirection;
private ListSortDirection _genderSortDirection;
public ListSortDirection NameSortDirection
{
get { return _nameSortDirection; }
set
{
_nameSortDirection = value;
RaisePropertyChanged(nameof(NameSortDirection));
}
}
public ListSortDirection AgeSortDirection
{
get { return _ageSortDirection; }
set
{
_ageSortDirection = value;
RaisePropertyChanged(nameof(AgeSortDirection));
}
}
public ListSortDirection GenderSortDirection
{
get { return _genderSortDirection; }
set
{
_genderSortDirection = value;
RaisePropertyChanged(nameof(GenderSortDirection));
}
}
private void NameColumnHeader_Click(object sender, RoutedEventArgs e)
{
ICollectionView view = CollectionViewSource.GetDefaultView(DataGrid.ItemsSource);
if (view.SortDescriptions.Count > 0)
{
SortDescription currentSort = view.SortDescriptions[0];
if (currentSort.PropertyName == "Name")
{
NameSortDirection = currentSort.Direction == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;
view.SortDescriptions[0] = new SortDescription("Name", NameSortDirection);
}
else
{
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
}
}
else
{
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
}
}
```
在代码中,我们定义了三个属性NameSortDirection、AgeSortDirection和GenderSortDirection分别对应三个列的排序方向。在NameColumnHeader_Click方法中,我们通过CollectionViewSource.GetDefaultView方法获取到datagrid控件的数据视图(ICollectionView),如果当前视图已经存在排序条件,则判断当前的排序属性是否与当前列相同,如果相同则切换排序方向,如果不同则清除已有的排序条件并重新添加当前列的排序条件;如果当前视图不存在排序条件,则直接添加当前列的排序条件。
四、分页显示数据
当我们的数据量非常大时,直接展示所有数据可能会使程序变得缓慢,甚至崩溃。为了解决这个问题,我们可以采用分页的方式展示数据。
datagrid控件本身不支持分页功能,但我们可以通过将数据分成多个页面,再将这些页面绑定到控件上来实现分页。
```csharp
public class PeopleViewModel : ViewModelBase
{
private List
private ObservableCollection
public ObservableCollection
{
get { return _currentPage; }
set { _currentPage = value; RaisePropertyChanged(nameof(CurrentPage)); }
}
private int _currentPageIndex = 1;
private int _pageSize = 20;
private int _totalPages;
public PeopleViewModel()
{
_peopleList = //初始化数据源
_totalPages = (int)Math.Ceiling((double)_peopleList.Count / _pageSize);
ChangePage(_currentPageIndex);
}
private void ChangePage(int pageNumber)
{
int startIndex = (pageNumber - 1) * _pageSize;
CurrentPage = new ObservableCollection
}
public void OnNextPage()
{
if (_currentPageIndex < _totalPages)
{
_currentPageIndex++;
ChangePage(_currentPageIndex);
}
}
public void OnPrevPage()
{
if (_currentPageIndex > 1)
{
_currentPageIndex--;
ChangePage(_currentPageIndex);
}
}
}
```
在ViewModel中,我们定义了_currentPageIndex表示当前页面的编号,_pageSize表示每一页的数据量,_totalPages表示数据的总页数。在初始化的时候将数据源按照pageSize分成多个页面,然后绑定_currentPage到datagrid控件上。
接着,我们定义了两个方法OnNextPage和OnPrevPage,它们分别用于让_currentPageIndex加1或减1,然后调用ChangePage方法重新加载相应页面的数据。
五、自定义单元格
在一些情况下,我们可能需要对datagrid控件中的某些列进行自定义(如插入一个按钮等),这时就需要自定义单元格。
```xaml