2016-02-10 2 views
0

У меня есть ObservableCollection, который TypeOf 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); 
    } 

} 

Если коллекция неоспоримым изменилась, она запускает событие в основной форме начиная с некоторой обработки в пользовательском интерфейсе.

Все работает нормально (использование, экспорт), но как только я де-сериализую xml-файл и копирую ObservableCollection, события ObservableCollection больше не будут запущены. Если я отлаживаю экземпляр TestCases, то все изменения можно найти в этой коллекции.

Почему?

спасибо!

Update:

Я перезаписать всю коллекцию и, таким образом, нет делегата событий, указывающих на мой обработчику событий больше. Это так глупо. Спасибо @all за помощь.

ответ

2

Это просто потому, что вы заменяете всю коллекцию. Эти события не регистрируются в новом экземпляре, созданном при вызове Deserialize. (De) сериализация выполняет сериализацию данных, а не событий.

Я бы предложил очистить текущую коллекцию и добавить к ней все элементы из десериализованной коллекции.

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

_tcMngr.TestCases.Clear(); 

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

Таким образом, оригинальные _tcMngr.TestCases остается неизменным, в том числе все его обработчики событий.

+0

Это означает, что Serializer не только вставляет новые элементы, но и перезаписывает даже делегатов коллекции, даже если в XML-файле нет содержимого? – AllDayPiano

+0

Ну, вы создаете новую коллекцию, которая полностью заменит другую. Он ничего не перезаписывает, он только начинается снова. –

+0

Ох, с ***, ты прав! Это было глупо! ... Полагаю, пора обедать! – AllDayPiano

1

Ожидаемое поведение, когда вы сериализуете свои ObservableCollection, , все обработчики событий не сериализованы. Это проблематично, если это возможно, потому что это адреса в памяти. Каждый раз, когда мы запускаем приложение, эти адреса не совпадают.

Вот почему де-сериализация не возвращает его в исходное состояние.

1

Вы замена коллекции здесь

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

Попытки очистить текущую коллекцию и добавлять новые элементы.

+0

Да, видел после публикации, медленно inet @ d airport – Krazibit312

+0

Без проблем :). Наслаждайтесь вашим полетом. –

Смежные вопросы