gpt4 book ai didi

c# - CollectionChanged 事件的循环数据库更新

转载 作者:搜寻专家 更新时间:2023-10-30 20:34:54 24 4
gpt4 key购买 nike

我手上有一个真正的难题。

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

模型集合中的对象是从 SQLite 数据库中存储和检索的。我分配了一个方法 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

我真的不知道如何解决这个问题。有人知道这里有足够的模式吗?

最佳答案

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

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...
}
}

关于c# - CollectionChanged 事件的循环数据库更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45236816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com