Bind AvalonEdit to XML

本文关键字:XML to AvalonEdit Bind | 更新日期: 2023-09-27 18:15:56

我在我的WPF项目中使用AvalonEdit控件,并且我将它与XML语法高亮一起使用。我只是使用它作为XML编辑器(不需要树形视图或任何东西)。我想要的是:

  1. 将其绑定到某种XML数据结构,并在节点被删除/更新/删除时获得通知。
  2. 使用基于XSD文件的自动复杂化。

我看到新的AvalonEdit有一个ICSharpCode.AvalonEdit.Xml命名空间,但我不知道如何使用它来满足我自己的需求。有什么建议吗?

Bind AvalonEdit to XML

我知道如何做第一部分(我假设你可以使用LINQ(即有。net 3.5或更高版本),这只是一个简单的问题,使用一些XLINQ和连接两个事件Changed/Changing,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Collections.ObjectModel;
using System.Reactive.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        public static XDocument doc; 
        static void Main(string[] args)
        {
            doc = XDocument.Parse("<books><book>Gone with the wind</book></books>");
            doc.Changed += Doc_Changed;
            doc.Changing += Doc_Changing;
            PrintResults();
            XElement newElement = new XElement("book", "Treasure Island");
            doc.Elements().First().Add(newElement);
            newElement.Remove(); //remove this noe from parent
            Console.ReadLine();
        }
        static void Doc_Changing(object sender, XObjectChangeEventArgs e)
        {
            PrintChangeResults(e);
        }
        static void Doc_Changed(object sender, XObjectChangeEventArgs e)
        {
            PrintChangeResults(e);
        }
        public static void PrintChangeResults(XObjectChangeEventArgs e)
        {
            Console.WriteLine(string.Format("Change was {0}, Document now has {1} elements", 
                e.ObjectChange, doc.Elements().First().Elements().Count()));
        }
        public static void PrintResults()
        {
            Console.WriteLine(string.Format("Document now has {0} elements", 
                doc.Elements().First().Elements().Count()));
        }
    }
}

将产生如下输出

文档现在有1个元素更改是添加,文档现在有1个元素更改是添加,文档现在有2个元素更改为删除,文档现在有2个元素更改为删除,文档现在有1个元素

这样你就完成了1/2(前提是你可以使用LINQ)