ObservableCollection的反序列化会杀死事件?

时间:2016-02-10 10:20:48

标签: c# events observablecollection

我有一个类型为UITestCaseElement的ObservableCollection:

public ObservableCollection<UITestCaseElement> TestCases = new ObservableCollection<UITestCaseElement>();

public class UITestCaseElement : IDisposable
{
    public int UniqueIdentifier { get; set; }
    public string TestCaseName { get; set; }
    public string TestCaseDescription { get; set; }

    public int RepeatCount { get; set; }

    [XmlIgnore] 
    public int NumOfRuntimes { get; set; }

    public bool IsActive { get; set; }

    [XmlIgnore]
    public Testcases.AbstractTestCase TestObject { get; set; }

    [XmlIgnore]
    public OMS4Driver.DeviceObject DeviceObject { get; set; }

    [XmlIgnore]
    public OMS4Driver.ClientObject ClientObject { get; set; }

    [XmlIgnore]
    public OMS4Driver.Generic.CameraSelect SelectedCamera { get; set; }

    public void Dispose() { }
}

这就是我打开生成的XML的方式:

private void mnuLoadConfig_Click(object sender, EventArgs e)
{
    var serializer = new XmlSerializer(typeof(System.Collections.ObjectModel.ObservableCollection<UITestCaseElement>));

    using (var reader = new StreamReader(@"C:\Users\xxx\Desktop\test.xml"))
    {
        _tcMngr.TestCases = (System.Collections.ObjectModel.ObservableCollection<UITestCaseElement>)serializer.Deserialize(reader);
    }

}

如果该集合发生了变化,它会向主窗体发出一个事件,开始在UI上进行一些处理。

一切正常(使用,导出)但是一旦我反序列化xml文件并复制回ObservableCollection,ObservableCollection事件就不再被触发了。如果我调试TestCases实例,则可以在此集合中找到所有更改。

为什么呢?

非常感谢!

更新

我覆盖了完整的集合,因此不再有指向我的事件处理程序的事件的委托。某种程度上这是愚蠢的。谢谢@all的帮助。

3 个答案:

答案 0 :(得分:2)

这只是因为你替换了整个集合。这些事件未在调用Deserialize时创建的新实例上注册。 (De)序列化只会序列化数据,而不是事件。

我建议清除当前集合并将反序列化集合中的所有项添加到其中。

var newCollection = (ObservableCollection<UITestCaseElement>)serializer.Deserialize(reader);

_tcMngr.TestCases.Clear();

foreach (var item in newCollection)
{
    _tcMngr.TestCases.Add(item);
}

通过这种方式,原始_tcMngr.TestCases保持不变,包括其所有事件处理程序。

答案 1 :(得分:1)

这是预期的行为,当您序列化ObservableCollection所有事件处理程序未序列化时。如果可能的话,这是有问题的,因为这些是内存中的地址。每次我们运行应用程序时,这些地址都不一样。

这就是为什么反序列化不会让它恢复到原始状态的原因。

答案 2 :(得分:1)

你正在替换这里的收藏

 _tcMngr.TestCases = (System.Collections.ObjectModel.ObservableCollection<UITestCaseElement>)serializer.Deserialize(reader);

尝试清除当前收藏并添加新项目。