2015-02-10 3 views
1

Я строю объект, который содержит ObservableCollection в пределах ObservableCollection. Дессериализация объекта ниже работает правильно, чтобы создать коллекцию CustomTab элементов, но не Task элементов.Deserialize XML вложенные списки вложенные ObservableCollection

Приведенный ниже код производит нуль Task элементов. Если изменить код на:

[XmlElement("Tasks")]   // was "Task" in original code 
public ObservableCollectionExtended<UtilitiesTask> TasksCollection 

я получаю один пункт в TasksCollection (должно быть 2 или 3 элемента в зависимости от которых CustomTab я читаю).

Как я могу получить TasksCollection, заполненную всеми Task элементами под соответствующим Tasks root?

ПРИМЕЧАНИЕ: Я упростил все свойства только { get; set; } для удобства чтения. В коде есть каждый, кто отправляет уведомление о любых изменениях.

Я использую платформу SimpleMVVM, в которой находится ModelBase<>.

Вот мой код:

CustomTabs.xml

<?xml version="1.0" encoding="utf-8"?> 
<CustomTabsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CustomTab> 
    <Header>88888</Header> 
    <TabVisibility>Visible</TabVisibility> 
    <Tasks> 
     <Task> 
      <TaskName>Task 11</TaskName> 
     </Task> 
     <Task> 
      <TaskName>Task 12</TaskName> 
     </Task> 
    </Tasks> 
    </CustomTab> 
    <CustomTab> 
    <Header>555</Header> 
    <TabVisibility>Visible</TabVisibility> 
    <Tasks> 
     <Task> 
      <TaskName>Task 21</TaskName> 
     </Task> 
     <Task> 
      <TaskName>Task 22</TaskName> 
     </Task> 
     <Task> 
      <TaskName>Task 23</TaskName> 
     </Task> 
    </Tasks> 
    </CustomTab> 
</CustomTabsConfig> 

CustomTabs.xsd

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
    <xs:element name="CustomTabsConfig" type="CustomTabsConfigType"/> 

    <xs:complexType name="CustomTabsConfigType"> 
    <xs:sequence> 
     <xs:element type="CustomTabType" name="CustomTab" maxOccurs="unbounded" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="CustomTabType"> 
    <xs:sequence> 
     <xs:element type="xs:int" name="Header"/> 
     <xs:element type="xs:string" name="TabVisibility"/> 
     <xs:element type="TasksType" name="Tasks"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="TasksType"> 
    <xs:sequence> 
     <xs:element type="TaskType" name="Task" maxOccurs="unbounded" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="TaskType"> 
    <xs:sequence> 
     <xs:element type="xs:string" name="TaskName"/> 
    </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

CustomTabsConfigModel.cs (отредактированный для краткости)

[XmlRoot("CustomTabsConfig")] 
public class CustomTabsConfigModel : ModelBase<CustomTabsConfigModel> 
{ 
    private ConfigReader<CustomTabsConfigModel> configReader; 

    /// <summary> 
    /// Create a configuration object bound to "CustomTabs.xml" 
    /// contained in [CommonApplicationData]\[Manufacturer]\[ProductName] 
    /// </summary> 
    public CustomTabsConfigModel() 
    { 
    } 

    /// <summary> 
    /// Create a configuration object bound to the specified file name 
    /// contained in [CommonApplicationData]\[Manufacturer]\[ProductName] 
    /// </summary> 
    /// <param name="fileName"></param> 
    public CustomTabsConfigModel(String fileName) 
    { 
     this.TabsFileName = fileName; 
    } 


    /// <summary> 
    /// Collection of custom tabs 
    /// </summary> 
    [XmlElement("CustomTab")] 
    public ObservableCollection<CustomTab> CustomTabsCollection { get; set; }   

    /// <summary> 
    /// Loads Tab info from customtabs.xml file 
    /// </summary> 
    public Boolean LoadConfig(String customTabsFileName = "CustomTabs.xml") 
    { 
     // Load tabs file 
     configReader = new ConfigReader<CustomTabsConfigModel>(customTabsFileName); 

     // if we cannot load the config file then don't do anything else 
     if (configReader.Load()) 
     { 
      // update all items from CustomTabs.xml 
      CustomTabsCollection = configReader.Data.CustomTabsCollection; 
     } 
     else 
     { 
      Log.Write(LogLevel.Fatal, "Configuration file failed to load."); 
      return false; 
     } 

     return true; 
    } 
} 

CustomTab.cs

[XmlRoot("CustomTab")] 
    public class CustomTab : ModelBase<CustomTab> 
    { 
     public CustomTab() 
     { 
      this.Header = ""; 
      this.TabVisibility = Visibility.Visible; 
     }  

     [XmlElement("Header")] 
     public String Header { get; set; } 

     /// <summary> 
     /// Sets the Visibility of the tab 
     /// </summary> 
     [XmlElement("TabVisibility")] 
     public Visibility TabVisibility { get; set; } 

     /// <summary> 
     /// Collection of Tasks 
     /// </summary> 
     [XmlElement("Task")] 
     public ObservableCollection<UtilitiesTask> TasksCollection { get; set; } 

    } 

    [XmlRoot("Task")] 
    public class UtilitiesTask : ModelBase 
    { 
     public UtilitiesTask() 
     { 
      this.TaskName = ""; 
     } 

     [XmlElement("TaskName")] 
     public String TaskName { get; set; }    
    } 
} 
+4

Если ее решить, просто ответить на свой вопрос :) – BradleyDotNET

+0

Если вы решили эту проблему , отправьте свое решение в качестве ответа и (или сейчас, или позже), примите этот ответ. –

+2

Для публикации вашего решения см. [Можно ли ответить на мой собственный вопрос?] (Http://stackoverflow.com/help/self-answer) и сделать это правильно. –

ответ

0

Я решил это, обновив TasksCollection так:

[XmlArray("Tasks")] 
[XmlArrayItem("Task", typeof(UtilitiesTask))] 
public ObservableCollection<UtilitiesTask> TaskCollection 
Смежные вопросы