首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

WPF ListView 綁定 DataTable 選中行時不刷新問題:自我解決記錄

     編輯:程式設計疑難解答

問題現象

WPF ListView ItemsSource 綁定 DataTable(lstvAlarm.DataContext = dtAlarmDisplay)。
當**已選中某行**時,切換篩選條件(如報警等級「高級」→「中級」):

  • 若新數據**不包含**原選中行 → ListView 僅取消選中,**不刷新內容**;必須手動點擊一下才更新。
  • 若新數據**包含**原選中行 → 正常刷新顯示。

根因分析(經驗總結)

DataTable 作為 ItemsSource 時,WPF 內部使用 DataView 進行排序/篩選。**選中行會導致 DataView 內部游標/位置狀態鎖定**,當 DataTable 內容變更(Rows.Clear() 後重新填充)時,DataView 未正確重置游標,導致 UI 不感知集合變更。

解決方案(任選其一)

方案一:重新綁定前清空選中狀態

// 刷新數據前
lstvAlarm.SelectedItem = null; // 或 lstvAlarm.UnselectAll()
// 再更新 DataTable
dtAlarmDisplay.Rows.Clear();
dtAlarmDisplay.Merge(newData);

方案二:使用 ICollectionView 顯式刷新

var view = CollectionViewSource.GetDefaultView(dtAlarmDisplay);
view.Refresh(); // 強制 UI 重新讀取

方案三:改用 ObservableCollection<T> 替代 DataTable(推薦)

定義實體類 AlarmItem,ViewModel 暴露 ObservableCollection<AlarmItem>,篩選時 Clear() + AddRange(),WPF 自動響應 INotifyCollectionChanged,**徹底避開 DataView 游標問題**。

總結

DataTable 綁定 WPF 控件時,**選中態與集合變更通知易衝突**。最穩健做法是**ViewModel 層轉換為 ObservableCollection<T>**;若必須用 DataTable,刷新前**強制清空選中**或**手動 Refresh View**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved