Тип job
, JobList
, не является списком, как следует из его типа.Он содержит только свойства одного задания.У вас есть только один экземпляр этого класса, и он назначен на job
.Каждый раз, когда вы сталкиваетесь с узлом, вы изменяете свойства этого экземпляра.
Когда вы пытались DB.Items.Add(job);
, вы добавляли этот же экземпляр в список элементов сетки, поэтому, естественно, он будет отображать этот элемент Nраз.Более того, это будет совокупный результат значений, которые вы присвоили этим свойствам (то есть последнее значение, записанное для каждого свойства).
Если я правильно понимаю вашу структуру (что сложно, потому что вы не показалиобразец XML), вы перемещаетесь по узлам XML и относитесь ко всем типам узлов одинаково (включая элементы и атрибуты).Если, например, у вас есть только два элемента, где один элемент имеет только атрибут JobDate
, а другой элемент имеет только атрибут FilePath
, job
в конечном итоге будет иметь оба назначенных свойства, и обе строки будут отображать эти два значения,Он не будет отображать одну строку с одним значением и другую строку с другим значением, поскольку у вас нет экземпляров, которые были помещены в эти состояния.
Другая проблема заключается в том, что вам не хватает идеи, что элемент должен отображатьсяк экземпляру JobList
, и атрибуты должны соответствовать свойствам этого экземпляра.findAllNodes
- это (возможно) хороший алгоритм для обхода узлов XML, но без различий в типах узлов он не выполняет то, что вам нужно, с целью загрузки данных.В частности, в некоторых типах узлов вам нужно создать экземпляр JobList
, а в других - присвоить значения его свойствам.XML-сериализация является лучшим вариантом здесь, потому что она сделает все это за вас.У вас даже есть атрибуты для него в свойствах, так что продолжайте и используйте его.
У вас также есть метод с именем LoadCollectionData
, но вы никогда не вызываете его (или, по крайней мере, вы не показали, что выЗвоню куда угодно).Этот метод возвращает список элементов, но он добавляет к нему единственный экземпляр JobList
, который вы когда-либо создавали, тот, который находится в вашем поле job
.
Если вы исключитев поле job
(строка, которая читает JobList job = new JobList();
), вы начнете получать ошибки там, где вы использовали этот экземпляр.Это сломает ваш код, но, надеюсь, это также покажет вам, где вы должны создавать новые экземпляры (или принимать экземпляры в качестве параметров).
Некоторые дополнительные примечания к обзору:
- Вы сохраняете XML-документ обратно на диск, не изменяя его.Вы можете безопасно удалить вызов
doc.Save
. - Загрузка данных в конструкторе, вероятно, не очень хорошая идея.Я не эксперт WPF (и я даже не играю по телевизору), но вы должны искать событие «load» для обработки или что-то в этом роде.В конце концов, вы захотите использовать
async
, чтобы ваш пользовательский интерфейс мог реагировать при загрузке. - Как правило, не объявляйте переменную, пока она вам не понадобится.Когда вы объявляете переменную и позволяете ей «гнить» до тех пор, пока вы ее не используете, вы позволяете себе делать ошибки в последовательности выполнения, что может привести к таким вещам, как
NullReferenceException
s, когда вы забудете, что еще не инициализировали ее.И не рекламируйте его в поле, пока не узнаете, что это должно быть поле.
Поскольку ответы идут, это примерно столько, сколько я могу сказать, потому что код, который вы предоставили, немного сложен иваше намерение не совсем ясно.Я желаю вам удачи в применении вышеуказанной информации.