簡體   English   中英

在 WPF DataGrid 中使用多個 XML 文檔

[英]Using Multiple XML Documents in a WPF DataGrid

因此,對於我正在從事的項目,我有一個小問題,我不知道如何最好地解決。

原則上,應用程序將從加載 XML 文件開始,我將始終知道該文件的位置和內容,並將其顯示在 DataGrid 中以供用戶查看。

然后,用戶可以 go 到應用程序的其他部分,以輸入他們希望以與原始格式相同的格式導出到 XML 的數據,但更重要的是這些“編輯”絕不能覆蓋原始數據,我需要要保存在單獨的 XML 文件中的新輸入或編輯。

我可以很好地處理該部分,但是如果可能的話,我希望 DataGrid 顯示 XML 文件的組合(並且可能需要能夠檢查新文件是否重疊並決定顯示哪個文件)。

我一直在 WPF 中制作程序,任何想法都會很棒。

謝謝。

數據網格 - 從 ItemsControl 派生的元素。 所有這些元素僅適用於一個數據源。 數據源必須是 IEnumerable。

您的兩個 XML 文件是兩個不同的數據源。

我看到兩個解決方案。

創建一個包含兩個 DataGrid 的 UserConrol 並同步其中的行滾動。

在 ViewModel 中,從兩個源文件中創建一個包含來自這兩個文件的數據的復雜集合。

序列化和反序列化是使用 xml 的簡單 csharp 友好方式。

您希望 xml 在磁盤上,但如果您綁定 ObservableCollection 而不是直接來自 xml 的某些 object 源,您的代碼將更容易使用。

如果這對您來說是一個新概念,請從這里開始閱讀:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/

這將涉及序列化一個 class ,它具有一個公共屬性,它是一個 List ,其中 t 是 class 對應於 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;
    }

您需要做的就是擁有公共屬性,不需要任何屬性即可。

屬性本身可以是復雜對象,因此您可以將列表之類的東西作為每個對象的屬性。

您可能還需要 class 中的屬性,您可以使用它來告訴您記錄的來源。 例如,這是來自原始文件還是從編輯文件中合並。

使用 Linq 合並您的數據列表。

例如:

var combinedList = listOriginal.Union(listNew).ToList();

我不清楚你對組合列表做了什么,但這就是你如何將它們整合到一個列表中的方式。

如果涉及邏輯,您可能會進一步操作該列表並轉換為另一個視圖模型列表。

然后,您可以將該列表綁定到列表視圖或數據網格的項目源。

在我寫這篇文章時,我很清楚你沒有解釋你的問題。 我強烈建議您編輯您的帖子並闡明您的要求。 因為您的問題可能會以其他方式關閉。

我決定放棄並改用 2 個數據網格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM