簡體   English   中英

可分頁的Datagrid ItemSource引發null異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM