【问题标题】:Bind AvalonEdit to XML将 AvalonEdit 绑定到 XML
【发布时间】:2012-01-06 05:50:51
【问题描述】:
我在我的 WPF 项目中使用 AvalonEdit 控件,并将它与 XML 语法高亮一起使用。我只是将它用作 XML 编辑器(不需要侧面的树视图或任何东西)。我想要的是:
- 将其绑定到某种 XML 数据结构,并在删除/更新/删除节点时获得通知。
- 使用基于 XSD 文件的自动编译。
我看到新的 AvalonEdit 有一个 ICSharpCode.AvalonEdit.Xml 名称空间,但我不知道如何根据自己的需要使用它。有什么建议吗?
【问题讨论】:
标签:
c#
.net
wpf
xml
avalonedit
【解决方案1】:
我知道如何做第一部分(我假设您可以使用 LINQ(即具有 .NET 3.5 或更高版本),这只是使用一些 XLINQ 并连接 2 个事件 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)