2

我仍处于 WPF、EF 和 MVVM 的学习阶段,现在我遇到了以下问题。我可以在我的 DataGridView 中删除和插入新项目,但我不知道如何更新我的项目。

我所做的就是选择一个已经有主键的空行,然后将数据放入其中。它正在工作(更新数据库),但 GridView 没有刷新。我需要先重新启动程序才能看到我更新的数据。

我的执行命令来更新我的数据库。我在 ViewModel 类

        public void ExecuteUpdate(object obj)
        {
            try
            {
                
                SelectedIndex.Child_Update(new Farbe { FarbauswahlNr = SelectedIndex.FarbauswahlNr, Kurztext = SelectedIndex.Kurztext, Ressource = SelectedIndex.Ressource, Vari1 = SelectedIndex.Vari1, Vari2 = SelectedIndex.Vari2 });
                //ListeAktualisieren --> Refreshing the List
                ListeAktualisieren();                     
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());   
            }
        }

这是我应该刷新 GridView 的刷新方法。我在 ViewModel 类

        public void ListeAktualisieren()
        {


            farbliste.ListeAktualisieren(db);
            farbliste.Model = farbliste.Model.Concat(farbliste.Addlist).ToList();
            Model = farbliste.Model;
            farbliste.Addlist.Clear();
        }

该方法正在调用我的业务列表,该列表也有一个刷新方法。在这里从我的数据库中读取。我在 Business List 课程中

    public void ListeAktualisieren(TestDBEntities db)
    {
        Model.Clear();
        foreach (var item in db.Farben)
        {
            //Insert and delete working
            add = new Farbe { FarbauswahlNr = item.FarbauswahlNr, Kurztext = item.Kurztext, Ressource = item.Ressource, Vari1 = Convert.ToBoolean(item.Var1), Vari2 = item.Vari2 };
            Addlist.Add(add);              
        }           

    }

模型是我的 GridView 的源,它在更新时不刷新更改的数据,但在插入或删除时显示新的数据行。

4

2 回答 2

2

您需要具有已实施 INotifyPropertyChanged 的​​ Observablecollections 和 Classes。通过 insert 将新元素添加到 Observablecollection 并引发 event 属性changed by a change。其余的应该由 WPF 完成。

编辑:DataGrid 的 Sourcecollection 必须是 Observablecollection。


Edit2:为了很好,我把评论的结果放在这里 ;-) DataGrid 的每一行都是集合的一个元素。一行的每个单元格都侦听其元素的 PropertyChangedEvent(字符串区分大小写,所以要小心)。如果在 propertychangedevent 之后没有调用属性的 getter,则绑定没有收到该事件。这段代码可以帮助确保您不会使用不存在的字符串进行调用:

private void VerifyPropertyName(string PropertyName)
{
    if (string.IsNullOrEmpty(PropertyName))
        return;
    if (TypeDescriptor.GetProperties(this)(PropertyName) == null) {
        string msg = "Ungültiger PropertyName: " + PropertyName;
        if (this.ThrowOnInvalidPropertyName) {
            throw new isgException(msg);
        } else {
            Debug.Fail(msg);
        }
    }
}
于 2013-03-20T13:40:13.417 回答
0

尝试将此添加到您的绑定部分 ItemsSource="{Binding Path=Model, UpdateSourceTrigger= PropertyChanged"}

于 2013-03-21T08:13:00.153 回答