Привязать AvalonEdit к XML - PullRequest
       7

Привязать AvalonEdit к XML

2 голосов
/ 25 ноября 2011

Я использую элемент управления AvalonEdit в своем проекте WPF и использую его с подсветкой синтаксиса XML.Я просто использую его в качестве редактора XML (нет необходимости в виде дерева на стороне или что-нибудь).То, что я хочу, это:

  1. Привязать его к какой-либо структуре данных XML и получать уведомления, когда узел удаляется / обновляется / удаляется.
  2. Использование на основе автокомпиляциив файле XSD.

Я видел, что новый AvalonEdit имеет пространство имен ICSharpCode.AvalonEdit.Xml, но я не мог понять, как использовать его для своих собственных нужд.Есть предложения?

1 Ответ

1 голос
/ 06 января 2012

Я знаю, как сделать 1-ю часть (я предполагаю, что вы можете использовать LINQ (т.е. иметь .NET 3.5 или выше), это просто вопрос использования некоторого XLINQ и связывания 2 событий Изменено / Изменено, как показано ниже.:

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)

...