我手上有一个真正的吵闹。
我在我的模型中使用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更新它的集合。
我真的对如何解决这个问题感到茫然。有人知道这里的模式是否合适?
答案 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...
}
}