关于CollectionChanged事件的Cicular数据库更新

时间:2017-07-21 11:43:39

标签: c# wpf database sqlite events

我手上有一个真正的吵闹。

我在我的模型中使用ObservableCollection绑定到ViewModel中的另一个集合。这使我可以轻松地将ViewModel中的更改传播到模型,反之亦然。

从SQLite数据库中存储和检索Model集合中的对象。我已经分配了一个方法UpdateDatabase()来处理CollectionChanged,每次修改集合时都会从数据库中添加或删除项目,我添加了一个检索数据库内容的方法GetItems()

public class Data : Model
{
    private ObservableCollection<Item> Bundle;
    private DataBase database;

    public Data(){
    {
        Bundle = database.GetItems();
        Bundle.CollectionChanged += UpdateDatabase;
    }
    private void UpdateDataBase(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.OldItems != null)
        {
            database.Delete(e.OldItems);
        }
        if (e.NewItems != null)
        {
            database.Insert(e.NewItems);
        }
    }
    public void Refresh()
    {
        ObservableCollection<Item> NewItems = database.GetItems();
        Bundle.Clear();
        foreach (Item item in NewItems)
        {
            Bundle.Add(item);
        }
    }
}

public class Database
{
    public ObservableCollection<Item> GetItems(){...}
    public void Delete(IList items){...}
    public void Insert(IList Items){...}
    [...]
}

问题在于,每次通过查询数据库并将检索到的项添加到集合来刷新模型时,它都会触发CollectionChanged并尝试将我刚检索到的项目插入数据库数据库

然而,我仍然需要触发CollectionChanged,以便ViewModel更新它的集合

Diagram of function calls

我真的对如何解决这个问题感到茫然。有人知道这里的模式是否合适?

1 个答案:

答案 0 :(得分:1)

当您不想在false事件处理程序中执行某些操作时,可以使用设置CollectionChanged的布尔标记,例如:

public class Data : Model
{
    private ObservableCollection<Item> Bundle;
    private DataBase database;

    public Data()
    {
        Bundle = database.GetItems();
        Bundle.CollectionChanged += UpdateDatabase;
    }

    private bool _doUpdate = true;
    private void UpdateDataBase(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (!_doUpdate)
            return;

        if (e.OldItems != null)
        {
            database.Delete(e.OldItems);
        }
        if (e.NewItems != null)
        {
            database.Insert(e.NewItems);
        }
    }
    public void Refresh()
    {
        _doUpdate = false; //suspend updates...
        ObservableCollection<Item> NewItems = database.GetItems();
        Bundle.Clear();
        foreach (Item item in NewItems)
        {
            Bundle.Add(item);
        }
        _doUpdate = true; //resume updates...
    }
}