C# WPF 在程序代码中试图修改或动态添加ItemsSource中的内容时,会报错禁止操作。
报错提示:当 ItemsSource 正在使用时操作无效。改用 ItemsControl.ItemsSource 访问和修改元素。
我们今天就来说说这个问题的解决方案。
首先先说下需求,在XAML中有两个ComboBox下拉选择框,
第一个:显示学年,控件名: cmbSchoolYear 控件ComboBoxItem分别显示:高一、高二、高三
第二个:显示班级,控件名:cmbClass 控件ComboBoxItem读取数据库获得所有数据。
我希望当窗口加载时默认查询数据库所有班级作为cmbClass 的ItemsSource。
当,cmbSchoolYear 选择了某一项后,再次查询数据库,把所有属于高一的班级查出来作为cmbClass 的ItemsSource。
一、通常错误的做法:
public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { //创建一个名为iClassList的List<Class>并读取数据赋值给iClassList List<Class> iClassList = new ClassBLL().GetAll(); //将iClassList设置给下拉框cmbClass数据源 this.cmbClass.ItemsSource = iClassList; } //年级ComboBox选中项变化事件 private void cmbSchoolYear_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { //清空cmbClass现有ComboBoxItem cmbClass.Items.Clear(); //获得当前ComboBox的选中内容 string iSchoolYear_SelectNow = ((ComboBoxItem)cbType.SelectedItem).Content.ToString(); //创建一个名为iClassList的List<Class>并读取数据赋值给iClassList List<Class> iClassList = new ClassBLL().GetAllBySearchKeys(iSchoolYear_SelectNow); //将iClassList设置给下拉框cmbClass数据源 this.cmbClass.ItemsSource = iClassList; }
二、正确的做法:避免报以上的错误!
//声明全局变量List<UserRole> public List<Class> iClassList{ get; set; } public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { //读取数据并赋值给全局变量iClassList iClassList = new ClassBLL().GetAll(); //将iClassList设置给下拉框cmbClass数据源 this.cmbClass.ItemsSource = iClassList; } //年级ComboBox选中项变化事件 private void cmbSchoolYear_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { //清空cmbClass现有ComboBoxItem cmbClass.Clear(); //获得当前ComboBox的选中内容 string iSchoolYear_SelectNow = ((ComboBoxItem)cbType.SelectedItem).Content.ToString(); //读取数据并赋值给全局变量iClassList iClassList = new ClassBLL().GetAllBySearchKeys(iSchoolYear_SelectNow); //将iClassList设置给下拉框cmbClass数据源 this.cmbClass.ItemsSource = iClassList; }
这样,我们声明了一个全局变量,用这个全局变量作为ItemsSource ,对该全局变量进行操作就不会报错了!
评论回复