序列化和反序列化是使用 xml 的简单 csharp 友好方式。
您希望 xml 在磁盘上,但如果您绑定 ObservableCollection 而不是直接从 xml 绑定某些对象源,您的代码将更容易使用。
如果这对您来说是一个新概念,请从这里开始阅读:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/
这将涉及序列化一个具有公共属性的类,该公共属性是一个 List,其中 t 是与您的 xml 文件的每个节点对应的类。
这是一些通用的序列化和反序列化代码:
public static void saveType<T>(T obj, string fileURL)
{
if (!fileURL.EndsWith(".xml"))
{
fileURL += ".xml";
}
using (FileStream writer = new FileStream(fileURL, FileMode.Create)) // FileMode.Create will over write an existing file
{
DataContractSerializer ser = new DataContractSerializer(typeof(T));
ser.WriteObject(writer, obj);
}
}
public static T readType<T>(string fileURL)
{
if (!fileURL.EndsWith(".xml"))
{
fileURL += ".xml";
}
var deserializedObj = Activator.CreateInstance(typeof(T));
if (!File.Exists(fileURL))
{
MessageBox.Show($"No file found at {fileURL}");
return (T)deserializedObj;
}
FileStream fs = new FileStream(fileURL, FileMode.Open);
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
DataContractSerializer ser = new DataContractSerializer(typeof(T));
deserializedObj = (T)ser.ReadObject(reader, true);
reader.Close();
fs.Close();
return (T)deserializedObj;
}
public static void SaveArmy(string fileURL, Army army)
{
saveType<Army>(army, fileURL);
}
public static Army ReadArmy(string fileURL)
{
Army army = readType<Army>(fileURL);
return army;
}
您需要做的就是拥有公共属性,不需要任何属性。
属性本身可以是复杂的对象,因此您可以将列表之类的东西作为每个属性的属性。
您可能还需要类中的一个属性,您可以使用它来告诉您记录的来源。例如,这是来自原始文件还是从编辑文件中合并。
使用 Linq 合并您的数据列表。
例如:
var combinedList = listOriginal.Union(listNew).ToList();
我不清楚你如何处理组合列表,但这就是你如何将它们合并为一个。
如果涉及逻辑,您可能会进一步操作该列表并转换为另一个视图模型列表。
然后您可以将该列表绑定到列表视图或数据网格的项目源。
在我写这篇文章的时候,我很清楚你没有对你的问题做出解释。我强烈建议您编辑您的帖子并阐明您的要求。因为您的问题很可能会被关闭。