C# 将XML嵌套列表反序列化为嵌套的ObservableCollection
我正在构建一个对象,该对象包含C# 将XML嵌套列表反序列化为嵌套的ObservableCollection,c#,xml,observablecollection,xml-deserialization,C#,Xml,Observablecollection,Xml Deserialization,我正在构建一个对象,该对象包含可观察集合中的可观察集合。反序列化下面的对象可以正确地创建CustomTab项的集合,但不能创建Task项 下面显示的代码生成零个任务项。如果我将代码更改为: [XmlElement("Tasks")] // was "Task" in original code public ObservableCollectionExtended<UtilitiesTask> TasksCollection CustomTabs.xsd <
可观察集合
中的可观察集合
。反序列化下面的对象可以正确地创建CustomTab
项的集合,但不能创建Task
项
下面显示的代码生成零个任务
项。如果我将代码更改为:
[XmlElement("Tasks")] // was "Task" in original code
public ObservableCollectionExtended<UtilitiesTask> TasksCollection
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”)]
公共类CustomTabsConfigModel:ModelBase
{
私有配置读卡器配置读卡器;
///
///创建绑定到“CustomTabs.xml”的配置对象
///包含在[CommonApplicationData]\[Manufacturer]\[ProductName]中
///
公共自定义选项卡ConfigModel()
{
}
///
///创建绑定到指定文件名的配置对象
///包含在[CommonApplicationData]\[Manufacturer]\[ProductName]中
///
///
公共CustomTabsConfigModel(字符串文件名)
{
this.TabsFileName=文件名;
}
///
///自定义选项卡的集合
///
[XmlElement(“CustomTab”)]
公共ObservableCollection CustomTabsCollection{get;set;}
///
///从customtabs.xml文件加载选项卡信息
///
公共布尔加载配置(字符串customTabsFileName=“CustomTabs.xml”)
{
//加载选项卡文件
configReader=新的configReader(customTabsFileName);
//如果无法加载配置文件,则不要执行其他操作
if(configReader.Load())
{
//从CustomTabs.xml更新所有项目
CustomTabsCollection=configReader.Data.CustomTabsCollection;
}
其他的
{
Log.Write(LogLevel.Fatal,“配置文件加载失败”);
返回false;
}
返回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; }
}
}
[XmlRoot(“CustomTab”)]
公共类CustomTab:ModelBase
{
公共自定义选项卡()
{
此.Header=“”;
this.TabVisibility=可见性.Visibility;
}
[XmlElement(“标题”)]
公共字符串头{get;set;}
///
///设置选项卡的可见性
///
[XmlElement(“TabVisibility”)]
公共可见性选项卡可见性{get;set;}
///
///任务集合
///
[XmlElement(“任务”)]
公共ObservableCollection任务集合{get;set;}
}
[XmlRoot(“任务”)]
公共类实用程序任务:模型库
{
公共事业任务()
{
this.TaskName=“”;
}
[XmlElement(“任务名”)]
公共字符串TaskName{get;set;}
}
}
我通过如下方式更新任务集合来解决此问题:
[XmlArray("Tasks")]
[XmlArrayItem("Task", typeof(UtilitiesTask))]
public ObservableCollection<UtilitiesTask> TaskCollection
[XmlArray(“任务”)]
[XmlArrayItem(“任务”,类型(实用程序任务))]
公共可观测集合任务集合
如果问题已解决,只需回答您自己的问题:)如果您已解决此问题,请将您的解决方案作为答案发布,并(现在或以后)接受该答案。有关发布您的解决方案,请参阅并正确发布。
[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; }
}
}
[XmlArray("Tasks")]
[XmlArrayItem("Task", typeof(UtilitiesTask))]
public ObservableCollection<UtilitiesTask> TaskCollection