Рекурсивное сохранение TreeView в XML

271
18 сентября 2017, 01:40

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

   //Метод сохранения TreeView в XML
    //current - текущий элемент XML 
    //item - текущий элемент TreeView
    private void SaveTreeItems(XElement current, TreeViewItem item)
    {
        foreach (TreeViewItem tree_item in item.Items)
        {
            Border b = tree_item.Header as Border;
            StackPanel stk = b.Child as StackPanel;
            Border port_in_border = stk.Children[0] as Border;
            TextBlock port_in = port_in_border.Child as TextBlock;
            Border port_out_border = stk.Children[1] as Border;
            TextBlock port_out = port_in_border.Child as TextBlock;
            TextBlock address = stk.Children[2] as TextBlock;
            TextBlock ip = stk.Children[3] as TextBlock;

            string _ip = ip.Text;
            string _address = address.Text;
            string _port_in = port_in.Text;
            string _port_out = port_out.Text;

            XElement newNode = new XElement(_address,
                                            new XAttribute("IP", _ip),
                                            new XAttribute("port_in", _port_in),
                                            new XAttribute("port_out", _port_out));
            //Возможно здесь неправильное условие выхода из рекурсии
            if (item.HasItems)
            {
                SaveTreeItems(newNode, item);
            }
            current.Add(newNode);
        }
    }
    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        TreeViewItem root = DeviceTree.Items[0] as TreeViewItem;
        XElement root_ = new XElement(root.Header.ToString());
        XDocument xdoc = new XDocument(root_);
        TreeViewItem tw = DeviceTree.Items[0] as TreeViewItem;
        SaveTreeItems(root_, tw);
        xdoc.Save("device.xml");
    }       
Answer 1

Если вам нужно строковое представление вашего TreeView используйте класс System.Windows.Markup.XamlWriter, для того что бы осуществить обратную операцию, т.е. получить из строки объект используйте System.Windows.Markup.XamlReader. В коде это выглядит так:

// Получаем строку, которая представляет ваш TreeView.
var str = System.Windows.Markup.XamlWriter.Save(myTree);
// Из строки получаем объект TreeView.
var obj = (TreeView)System.Windows.Markup.XamlReader.Parse(str);

Так как XAML это диалект XML, то при желании из полученной строки мы можем получить XDocument.

var str = System.Windows.Markup.XamlWriter.Save(myTree);
var doc = XDocument.Parse(str);
READ ALSO
Генератор формы? [требует правки]

Генератор формы? [требует правки]

Какой есть генератор формы с неограниченной вложенностью input элементов? Должна быть поддержка строк и массивов

252
Laravel 5 SleepingOwl Admin слетели базовые css и js

Laravel 5 SleepingOwl Admin слетели базовые css и js

После загрузки картинки в AdminFormElement::image на странице происходит эдакое

312
document is not defined Vue/Nuxt

document is not defined Vue/Nuxt

В документации по nuxt приведен пример

491