c# - 使用 MVVM 和 Message 在 Windows Store 中编辑 XML

标签 c# xml mvvm mvvm-light

在我的应用程序中,我在 App.xaml.cs 中创建 XML像这样:

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我使用存储库模式将这些数据绑定(bind)到 ObservableCollection,如下所示:
IList<Badge> list = await _badgeService.GetAll();

BadgesList = list.ToObservableCollection<Badge>();

但是,当我要在连接到另一个 VievModel ( QuestionViewModel ) 的另一个 View 中编辑这个 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());

并尝试再次绑定(bind)此集合:
private void CallCleanUp(CleanUp obj)
    {
        BadgesList = null;
        GetBadges();
    }

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

编辑
更改更新方法后,现在 GetAll() 中出现 UnauthorizedAccessException我的 BadgeService 中的方法,仍然很奇怪,因为 in 仅在更新 XML 后出现。

最佳答案

也许你应该试试这个:

dom.AppendChild(x);

在这之后:
x.AppendChild(x1);

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

关于c# - 使用 MVVM 和 Message 在 Windows Store 中编辑 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18756511/

相关文章:

c# - 在元组列表中查找具有最高 Item1 值的元组 - 然后将其从列表中删除

c# - ASP.NET Core 测试 - 在夹具中初始化 InMemory SQLite dbcontext 时获取 NullReferenceException

python - 将分层(树状)XML 读入 Pandas 数据框,保留层次结构

c# - 如何访问另一个类中的属性?

c# - 使用 ValidateRequest ="false"来规避 "A potentially dangerous Request.Form value was detected"的安全隐患是什么?

sql - 使用 nodes() 方法在 SQL 中展平分层 XML

c# - 在 C# 中查询 XML 的最佳方式——使用 LINQ 等

Javascript MVVM 设计模式 - 如何跟踪脏状态以及谁应该执行 Ajax?

从列表框项目模板中的按钮调用 Silverlight 命令

c# - .NET(或 C#)中的范围整数