2015-02-10 116 views
1

我在ObservableCollection內構建一個包含ObservableCollection的對象。反序列化下面的對象可正確地創建CustomTab項目的集合,但不會創建Task項目的集合。將XML嵌套列表反序列化爲嵌套ObservableCollection

下面顯示的代碼產生零Task項目。如果我改變代碼:

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

我得到TasksCollection一個項目(應該是取決於哪個CustomTab我讀2種或3個元素)。

我怎樣才能獲得TasksCollection填充Task項目在各自的Tasks根下?

備註:爲了便於閱讀,我已將所有屬性簡化爲{ 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(編輯爲簡潔起見)

個 ​​

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 2015-02-10 18:27:48

+0

如果你解決了這個,請將您的解決方案作爲答案發布,並且(現在或之後)接受該答案。 – 2015-02-10 18:28:17

+2

要發佈您的解決方案,請參閱[我可以回答我自己的問題?](http://stackoverflow.com/help/self-answer)並正確執行。 – 2015-02-10 18:30:20

回答

0

我通過更新解決了這個TasksCollection像這樣:

[XmlArray("Tasks")] 
[XmlArrayItem("Task", typeof(UtilitiesTask))] 
public ObservableCollection<UtilitiesTask> TaskCollection