MVVM - 在 .Clear 和 new 加载 ObservableCollection 之后保留选择

问题描述 投票:0回答:1

我有一个应用程序,它使用 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 不再可用于选择项目。

其他人如何处理这个问题以更新整个集合而不失去焦点?

wpf mvvm datagrid viewmodel observablecollection
1个回答
0
投票

在清除集合之前,请备份当前选定的项目(或仅备份选定项目的 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);
© www.soinside.com 2019 - 2024. All rights reserved.