我有一个类型为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实例,则可以在此集合中找到所有更改。
为什么呢?
非常感谢!
的
答案 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);
尝试清除当前收藏并添加新项目。