如何通过CollectionChangedEventHandler触发CSV文件读取方法?
解决思路及代码修改
问题原因
你的写法无效有两个核心问题:
- 委托类型不匹配:
PageLoad_Alt是RoutedEventHandler(参数为object和RoutedEventArgs),而CollectionChanged事件需要的是NotifyCollectionChangedEventHandler(参数为object和NotifyCollectionChangedEventArgs),两者签名不兼容,无法直接绑定。 - 语法错误:
PageLoad_Alt()是直接执行方法,而非传递委托引用,正确的委托传递不需要加括号。
解决方案
1. 抽离CSV读取逻辑为独立方法
把原来PageLoad_Alt里的CSV读取代码单独抽出来,让页面加载和集合变更都能复用这个逻辑,同时添加清空集合的操作避免重复数据:
private void LoadAltParkingData() { try { // 用Path.Combine替代字符串拼接,避免路径分隔符问题 string filepath = Path.Combine(directory, "ParkingTool_BESTAND.csv"); var config = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = ";" }; // 重新加载前清空旧数据 alte_parking_collection.Clear(); using (var csv = new CsvReader(new StreamReader(filepath), config)) { csv.Read(); csv.ReadHeader(); while (csv.Read()) { string barcodeField = csv.GetField<string>("Barcode"); string boxField = csv.GetField<string>("BoxNr"); string datumField = csv.GetField<string>("Datum"); alte_parking_collection.Add(new ParkingClass() { parking_barcode = barcodeField, parking_box = boxField, parking_datum = datumField }); } } code_box.Focus(); } catch (Exception ex) { MessageBox.Show("Bitte Datei überprüfen! " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Warning); code_box.Focus(); } }
2. 修改页面加载方法
让原来的PageLoad_Alt调用抽离后的方法:
//Alte Bestand private void PageLoad_Alt(object sender, RoutedEventArgs e) { LoadAltParkingData(); }
3. 绑定CollectionChanged事件
给parking_collection添加适配的事件处理方法,在集合变更时调用读取逻辑:
// 初始化parking_collection后添加事件绑定(比如在构造函数或页面初始化代码中) parking_collection.CollectionChanged += ParkingCollection_CollectionChanged; // CollectionChanged事件处理方法 private void ParkingCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { LoadAltParkingData(); }
这样不管是页面加载,还是parking_collection发生增删改操作时,都会重新读取CSV并刷新alte_parking_collection。
内容的提问来源于stack exchange,提问作者M.Nasiri
相关产品推荐
相关产品推荐

