我有一个应用程序,它使用 SQL Select 提取 DataTable,然后将每个项目加载到每个类的 ObservableCollection 中。
视图模型:
public ObservableCollection<SchachtelEintrag> DataGridMainCollection { get; set; } = new ObservableCollection<SchachtelEintrag>();
private void loadDataGridMainCollection()
{
DataGridMainCollection.Clear();
DataTable dt = new DataTable();
dt = mySql.selectSql("SELECT id, datum, artikel, kurztext, stueckzahl, blechstaerke, rohrmasse, " +
"material, kundenauftrag, ansprechpartner, abteilung, geaendertAm, twoWeeks, prio, ordnerpfad, dateiname FROM auftragstool.orders WHERE zustand = 'zu schachteln' ORDER BY import ASC, blechstaerke DESC");
if (dt.Rows.Count > 0)
{
foreach (DataRow r in dt.Rows)
{
DataGridMainCollection.Add(new SchachtelEintrag
{
Id = Convert.ToInt32(r["id"].ToString()),
Datum = Convert.ToDateTime(r["datum"].ToString()),
Artikel = r["artikel"].ToString(),
Kurztext = r["kurztext"].ToString(),
Stueckzahl = Convert.ToInt32(r["stueckzahl"].ToString()),
Blechstaerke = r["blechstaerke"].ToString(),
Rohrmasse = r["rohrmasse"].ToString(),
Material = r["material"].ToString(),
Kundenauftrag = r["kundenauftrag"].ToString(),
Ansprechpartner = r["ansprechpartner"].ToString(),
Abteilung = r["abteilung"].ToString(),
GeaendertAm = r["geaendertAm"].ToString(),
TwoWeeks = r["twoWeeks"].ToString(),
Prio = r["prio"].ToString(),
Ordnerpfad = r["ordnerpfad"].ToString(),
Dateiname = r["dateiname"].ToString()
});
}
}
}
我的 DataGrid 绑定到 ObservableCollection。
XAML:
<DataGrid ItemsSource="{Binding DataGridMainCollection}"
Selected="{Binding SelectedRow, Mode=TwoWay}">
现在不同的人正在使用该程序。一旦位置被删除或添加,程序就会向 TCP 服务器发送一个字符串。 TCP 服务器将命令发送回客户端,从而重新触发以下代码:
视图模型:
loadDataGridMainCollection() //Void from above
现在我知道重建 ObservableCollection 后,网格中的 SelectedItem 不再可用于选择项目。
其他人如何处理这个问题以更新整个集合而不失去焦点?
在清除集合之前,请备份当前选定的项目(或仅备份选定项目的 ID)。清除并刷新后,您必须在新填充的列表中找到您的备份项目。
这可以通过以下方式完成:
int? currentlySelectedId = null;
if(SelectedRow != null)
currentlySelectedId = SelectedRow.Id;
DataGridMainCollection.Clear();
// your code to refresh the data here
if(currentlySelectedId != null)
SelectedRow = DataGridMainCollection.FirstOrDefault(i => i.Id == backupItem.Id);