[英]Paggeable Datagrid ItemSource throws null exception
我想創建一個可以分頁的通用Datagrid
。 當我調用DataGrid_UC
的構造函數並傳遞20 Employees
它確實將所有20名Employees存儲在AllObject Observable Collection
。 並將CurrentPageItems
過濾為5。但是在設置datagrid.ItemsSource = CurrentPageItems
它將throws null exception
但CurrentPageItems確實包含5個項目。
DataGrid_UC.xaml
public partial class DataGrid_UC : UserControl
{
private ObservableCollection<object> _currentPageItems;
public ObservableCollection<object> CurrentPageItems
{
get
{
return _currentPageItems;
}
private set
{
if (_currentPageItems != value)
{
_currentPageItems = value;
}
}
}
// Default Entries per page Number
private int _pageSize = 5;
public int PageSize
{
get
{
return _pageSize;
}
set
{
if (_pageSize != value)
{
_pageSize = value;
Reset();
}
}
}
public int TotalPagesNumber
{
get
{
if (AllObjects != null && PageSize > 0)
{
return (AllObjects.Count - 1) / PageSize + 1;
}
return 0;
}
}
private int _currentPageNumber = 1;
public int CurrentPageNumber
{
get
{
return _currentPageNumber;
}
protected set
{
if (_currentPageNumber != value)
{
_currentPageNumber = value;
}
}
}
protected ObservableCollection<object> AllObjects { get; set; }
public DataGrid_UC()
{
InitializeComponent();
dataGrid.ItemsSource = CurrentPageItems;
}
public DataGrid_UC(IEnumerable<object> allObjects, int? entriesPerPage = null)
{
AllObjects = new ObservableCollection<object>(allObjects);
if (entriesPerPage != null)
PageSize = (int)entriesPerPage;
SetCurrentPageItems();
}
#region Public Methods
public void GoToNextPage()
{
if (CurrentPageNumber != TotalPagesNumber)
{
CurrentPageNumber++;
SetCurrentPageItems();
}
}
public void GoToPreviousPage()
{
if (CurrentPageNumber > 1)
{
CurrentPageNumber--;
SetCurrentPageItems();
}
}
#endregion
#region Private Methods
public void SetCurrentPageItems()
{
int upperLimit = CurrentPageNumber * PageSize;
CurrentPageItems =
new ObservableCollection<object>(
AllObjects.Where(x => AllObjects.IndexOf(x) > upperLimit - (PageSize + 1) && AllObjects.IndexOf(x) < upperLimit));
dataGrid.ItemsSource = CurrentPageItems;
}
private void Reset()
{
CurrentPageNumber = 1;
SetCurrentPageItems();
}
#endregion
private void next_Click(object sender, RoutedEventArgs e)
{
if (CurrentPageNumber != TotalPagesNumber)
{
CurrentPageNumber++;
SetCurrentPageItems();
}
}
private void previous_Click(object sender, RoutedEventArgs e)
{
if (CurrentPageNumber > 1)
{
CurrentPageNumber--;
SetCurrentPageItems();
}
}
}
主窗口.xaml
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<Employee> emp = new List<Employee>();
for (int i = 0; i < 20; i++)
{
Employee e = new Employee();
e.ID = i;
e.Name = "Test " + i;
emp.Add(e);
}
DataGrid_UC d = new DataGrid_UC(emp, 5);
newContentControl.Content = d;
}
}
dataGrid
成員為null,因為您的第二個構造函數缺少InitializeComponent
調用,該調用(除其他外)初始化xAML中通過x:Name
定義的類成員。
因此,像這樣更改構造函數:
public DataGrid_UC(IEnumerable<object> allObjects, int? entriesPerPage = null)
{
InitializeComponent();
AllObjects = new ObservableCollection<object>(allObjects);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.