Я строю объект, который содержит 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; }
}
}
Если ее решить, просто ответить на свой вопрос :) – BradleyDotNET
Если вы решили эту проблему , отправьте свое решение в качестве ответа и (или сейчас, или позже), примите этот ответ. –
Для публикации вашего решения см. [Можно ли ответить на мой собственный вопрос?] (Http://stackoverflow.com/help/self-answer) и сделать это правильно. –