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();
        }

このメソッドは、Refreshメソッドも取得したビジネスリストを呼び出しています。ここで私のデータベースから読んでいます。私はビジネスリストクラスにいます

    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 が必要です。挿入によって Observablecollection に新しい要素を追加し、変更によって変更されたイベント プロパティを発生させます。残りは WPF で行う必要があります。

編集: DataGrid の Sourcecollection は Observablecollection である必要があります。


Edit2: 念のため、ここにコメントの結果を入れておきます;-) DataGrid の各行は、コレクションの要素です。1 つの行の各セルは、その要素の 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 に答える