使用 MVVM 和消息在 Windows 应用商店中编辑 XML

本文关键字:编辑 XML 应用 Windows MVVM 消息 使用 | 更新日期: 2023-09-27 18:30:58

在我的应用程序中,我在 App.xaml 中创建 XML.cs如下所示:

public  async static void CreateBadgesXML()
    {
        StorageFolder sf = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Data", CreationCollisionOption.OpenIfExists);
        StorageFile st = await sf.CreateFileAsync("Badgess.xml", CreationCollisionOption.ReplaceExisting);
        XmlDocument dom = new XmlDocument();
        XmlElement x;
        x = dom.CreateElement("badges");
        dom.AppendChild(x);
        XmlElement x1 = dom.CreateElement("badge");
        XmlElement x11 = dom.CreateElement("id");
        x11.InnerText = "1";
        x1.AppendChild(x11);
        XmlElement x12 = dom.CreateElement("name");
        x12.InnerText = "Badge One";
        x1.AppendChild(x12);
        XmlElement x13 = dom.CreateElement("pictureurl");
        x13.InnerText = "two.png";
        x1.AppendChild(x13);
        XmlElement x14 = dom.CreateElement("isachieved");
        x14.InnerText = "false";
        x1.AppendChild(x14);
        x.AppendChild(x1);
        await dom.SaveToFileAsync(st);
    }

接下来在 MainViewModel 中,我使用存储库模式将这些数据绑定到 ObservableCollection,如下所示:

IList<Badge> list = await _badgeService.GetAll();
BadgesList = list.ToObservableCollection<Badge>();

但是,当我要在连接到另一个VievModel(QuestionViewModel)的另一个视图中编辑此XML时,如下所示:

public async Task Update(int id)
    {
        StorageFolder sf = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Data", CreationCollisionOption.ReplaceExisting);
        StorageFile st = await sf.CreateFileAsync("Badgess.xml", CreationCollisionOption.ReplaceExisting);
        XmlDocument dom = new XmlDocument();
        XmlElement x;
        x = dom.CreateElement("badges");
        dom.AppendChild(x);
        XmlElement x1 = dom.CreateElement("badge");
        XmlElement x11 = dom.CreateElement("id");
        x11.InnerText = "1";
        x1.AppendChild(x11);
        XmlElement x12 = dom.CreateElement("name");
        x12.InnerText = "Badge One";
        x1.AppendChild(x12);
        XmlElement x13 = dom.CreateElement("pictureurl");
        x13.InnerText = "two.png";
        x1.AppendChild(x13);
        XmlElement x14 = dom.CreateElement("isachieved");
        x14.InnerText = "true";
        x1.AppendChild(x14);
        x.AppendChild(x1);
        await dom.SaveToFileAsync(st);
    }

并从 QuestionViewModel 向 MainViewModel 发送消息,如下所示:

Messenger.Default.Send<CleanUp>(new CleanUp());

并尝试再次绑定此集合:

private void CallCleanUp(CleanUp obj)
    {
        BadgesList = null;
        GetBadges();
    }

我收到错误 XmlException"缺少根元素"。我不明白为什么在XML更新后,这个文件的内容是空的?有什么想法吗?

编辑更新方法更改后,现在我在BadgeService GetAll()方法中有一个未经授权的访问异常,仍然很奇怪,因为仅在更新XML后出现。

使用 MVVM 和消息在 Windows 应用商店中编辑 XML

也许你应该试试这个:

dom.AppendChild(x);

在此之后:

x.AppendChild(x1);

我认为您应该在创建 x1 和 x 后将 x 添加到您的 xml 文件中。