极品分享

C# WPF 代码动态修改ItemsSource解决方案,提示:当 ItemsSource 正在使用时操作无效。改用 ItemsControl.ItemsSource 访问和修改元素。

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 ,对该全局变量进行操作就不会报错了!

2017-05-03 0 /
NET学习
/
标签: 

评论回复

回到顶部