当前位置:   article > 正文

动态数据集合ObservableCollection的使用_c# observablecollection

c# observablecollection

在C/S架构中,常常会遇到动态更新数据,在不同的窗体中进行数据的动态操作,数据往往不能达到实时更新效果,而想要实现这一功能,C#中为我们提供了ObservableCollection类可以在添加,删除项目或刷新列表时提供属性变更通知,下面来总结一下ObservableCollection的使用。首先定义一个GlobalModel类,类中声明一个静态的动态集合,这样这个动态集合可以作为全局的变量进行使用:

 public class GlobalModel : ObservableObject
    {
        //全局静态变量 StudentVo
        private static ObservableCollection<StudentVo> studentMessage = new ObservableCollection<StudentVo>();
        public static ObservableCollection<StudentVo> StudentMessage
        {
           get { return studentMessage; }
            set
            {
                studentMessage = value;
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

下面是简单的页面,从页面看也是简单的增删改和导出,不过数据是存储在ObservableCollection临时集合中,是对ObservableCollection临时集合数据的增删改和通过学生Id进行排序。
在这里插入图片描述

首先是新增的功能,逻辑就是把用户操作的数据存储在ObservableCollection集合中,通过INotifyPropertyChanged接口监听StudentVo中的属性,如果集合有更改,就会提供属性变更通知

  public class StudentVo : INotifyPropertyChanged
    {
        private int studentId;
        public int StudentId
        {
            get
            {
                return studentId;
            }
            set
            {
                studentId = value;

                if (PropertyChanged != null)//有改变
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("StudentId"));
                }
            }
        }
        private string studentName;
        public string StudentName
        {
            get
            {
                return studentName;
            }
            set
            {
                studentName = value;
                if (PropertyChanged != null)//有改变
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("StudentName"));
                }
            }
        }
        private string studentNumber;
        public string StudentNumber
        {
            get
            {
                return studentNumber;
            }
            set
            {
                studentNumber = value;
                if (PropertyChanged != null)//有改变
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("StudentNumber"));
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;


  

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

新增成功后的数据信息根据学生id进行倒序显示。下面说说修改学生信息的操作,因为是临时的数据,我们无法根据学生Id 进行修改,怎么办呢?也在网上找了一下答案,无法根据学生Id修改那么我们只能根据索引index修改:

//获取列表选中值(唯一元素)
StudentVo student = GlobalModel.StudentMessage.Where(o => o.StudentId == SelectId).SingleOrDefault();
int index = GlobalModel.StudentMessage.IndexOf(student);//获取列表选中值的索引
GlobalModel.StudentMessage[index].StudentId = StudentId;
GlobalModel.StudentMessage[index].StudentName = StudentName;
GlobalModel.StudentMessage[index].StudentNumber = StudentNumber;
// GlobalModel.StudentMessage.OrderByDescending(o => o.StudentNumber);
MessageBox.Show("修改成功!");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

首先要获取你在表格中选的数据,从选中的数据中获取索引,然后根据索引修改数据。最后是搜索的功能:

  public RelayCommand SerchCommand
        {
            get
            {
                return serchCommand ?? (serchCommand = new RelayCommand(() =>
                {
                    var cvs = CollectionViewSource.GetDefaultView(StudentListEnty);
                    if (!string.IsNullOrEmpty(StudentInfo))
                    {
                        if (cvs != null && cvs.CanFilter)
                        {
                            cvs.Filter = OnFilterApplied;
                        }
                    }
                    else
                        cvs.SortDescriptions.Clear();
                }));
            }
        }
        private bool OnFilterApplied(object obj)
        {
            if (obj is StudentVo)
            {
                var text = StudentInfo;
                return (obj as StudentVo).StudentName.Contains(text)
                    || (obj as StudentVo).StudentNumber.Contains(text);
            }
            return false;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

先定义一个OnFilterApplied方法进行数据过滤,代码直接在命令中写了,哈哈,最后是效果展示:
在这里插入图片描述

如果想要动态更新数据,首先是类继承并实现INotifyPropertyChanged的方法,通过PropertyChanged方法提供属性变更通知,然后是通过静态的集合数据在全局进行使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/114565
推荐阅读
相关标签
  

闽ICP备14008679号