简体   繁体   中英

Paggeable Datagrid ItemSource throws null exception

I want to create a generic Datagrid that can paginate. When I call the constructor of my DataGrid_UC and pass 20 Employees it does stores all 20 Employees in AllObject Observable Collection . And filter out the CurrentPageItems to be 5. But upon setting datagrid.ItemsSource = CurrentPageItems it throws null exception but CurrentPageItems does contain 5 items.

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();
            }
        }



    }

Main Window.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;
        }
    }

The dataGrid member is null because your second constructor is missing the InitializeComponent call, which (among other things) initializes the class members defined in XAML by x:Name .

So change the constructor like this:

public DataGrid_UC(IEnumerable<object> allObjects, int? entriesPerPage = null)
{
    InitializeComponent();
    AllObjects = new ObservableCollection<object>(allObjects);
    ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM