C# - 检查 ObservableCollection CollectionChanged 事件是否已经完成执行

标签 c# events observablecollection

我有一个 XML 序列化列表,它是 ObservableCollection 类型。我实现了一个事件,因此每当对此集合进行更改时,它都应该被序列化,然后反序列化。

有一个外部类(Weapons Editor),可以添加、删除和修改武器。一旦按下删除按钮,它就会来到这个 WeaponsDB 类来收集 ObservableCollection。但是,它会在我的 CollectionChanged 事件执行之前刷新 ObservableCollection 中的内容。

如何确保 CollectionChanged 事件已完全执行,并且在任何其他类获得最新数据之前一切都是最新的?

public class WeaponDatabase
{
    [XmlArray("Weapons"), XmlArrayItem(typeof(Weapon), ElementName = "Weapon")]
    public ObservableCollection<Weapon> Weapons = new ObservableCollection<Weapon>();

    private string path = @"Inventory\WeaponsDB.xml";

    public WeaponDatabase()
    {
        DeserializeData();
        Weapons.CollectionChanged += Weapons_CollectionChanged;
    }

    void Weapons_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        SerializeData();
        DeserializeData();
    }

    public void SerializeData()
    {
        XmlSerializer Serializer = new XmlSerializer(typeof(ObservableCollection<Weapon>));
        TextWriter textWriter = new StreamWriter(path);
        Serializer.Serialize(textWriter, Weapons);
        textWriter.Close();
    }

    public void DeserializeData()
    {
        XmlSerializer Serializer = new XmlSerializer(typeof(ObservableCollection<Weapon>));
        StreamReader reader = new StreamReader(path);
        Weapons = (ObservableCollection<Weapon>)Serializer.Deserialize(reader);
        reader.Close();
    }
}

最佳答案

我还没有使用过 ObservableCollection,所以我可能有点离题了,但是嘿。

很可能,您的弱点在于您正在倒退地看待这个问题。 CollectionChanged 应该被触发,让访问集合的外部对象知道集合已更新,而不是用于更新实际集合(通过将其转储到文件或从 XML 文件重建)。

即:

这个外部类应该有一个类似这样的设置:

    public class WeaponsEditor
    {
        private WeaponsDatabase DB;
        public WeaponsEditor()
        {
            DB = new WeaponsDatabase();
            DB.CollectionChanged += CollectionChanged;
        }

        private object CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            // respond to the updated database
        }
    }

基本上,CollectionChanged 事件是供其他对象 响应已更改的集合,而不是供您的类进行更新。如果 Weapons Editor 对象直接操作集合,那是你的问题;您应该让它调用 Wea​​ponsDatabase 中的自定义方法,该方法会将请求转发到集合,然后立即调用序列化/反序列化方法。

关于C# - 检查 ObservableCollection CollectionChanged 事件是否已经完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094550/

相关文章:

c# - 难以理解 Silverlight 和 SQL

iOS:播放电影时模拟搜索栏上的拖动事件

jQuery 在事件之间传递 var

datagrid - 绑定(bind)到 ObservableCollection<T> 时如何删除 DataGrid 的空白行?

c# - 我可以从 SmtpClient.SendAsync 的 userToken 对象中获得什么好处?

c# - 使用 nhibernate 有什么方法可以在接口(interface)中映射只读属性

c# - 通过 NuGet 错误 'Newtonsoft.Json' 安装 json.NET 已经为 Microsoft C# 定义了依赖项

javascript - 如何在单击时将新的输入行添加到表中?

c# - 将事件从可观察对象引发到它的容器

c# - 如何对可观察集合进行排序?