Задать вопрос
@INTERNALINTERFERENCE

Как отображать префиксное дерево на UI?

логика такая: в логгер прилетает событие вида $SYS/broker/started, $SYS/broker/clients/count, $SYS/broker/subscriptions/maximum, которое обрабатывается алгоритмом для построения префиксного дерева, а затем по логике на ui должна появится древовидная структура, но я не понимаю, как ее отобразить. Я смотрел пример построения дерева (
<TreeView Items="{Binding Items}" >
      <TreeView.ItemTemplate>
        <TreeDataTemplate ItemsSource="{Binding Items}">
          <TextBlock Text="{Binding Name}"/>
        </TreeDataTemplate>
      </TreeView.ItemTemplate>
    </TreeView>

), но мне непонятно, как из моего кода вынести элементы, которые необходимо биндить. Вот алгоритм построения дерева:
public class DrawTreeService
{
    public class Tree
    {
         public readonly Dictionary<string, Tree> Trees = new();
         public readonly HashSet<string> Files = new();
    }

    static private bool DrawTree(Tree rootTree, IEnumerable<string> items)
    {
         var u = false;
         foreach (var filename in items
                      .Where(x => !x.Contains('/'))
                      .Where(x => !rootTree.Files.Contains(x)))
         {
              rootTree.Files.Add(filename);
              u = true;
         }

         var subfolders = items
             .Where(x => x.Contains('/'))
             .Select(filename =>
             {
                  var array = filename.Split('/');
                  var prefix = array.First();
                  var subFile = array.Skip(1).Aggregate((a, b) => a + '/' + b);

                  return (prefix, filename: subFile);
              })
              .ToArray();

          subfolders
              .GroupBy(t => t.prefix)
              .ToList()
              .ForEach(t =>
              {
                  var folder = t.Key;
                  if (!rootTree.Trees.ContainsKey(folder))
                  {
                       rootTree.Trees[folder] = new Tree();
                       u = true;
                  }

                  var u1 = DrawTree(rootTree.Trees[folder], t.Select(t1 => t1.filename).ToArray());
                        u = u1;
              });

                return u;
     }
}
  • Вопрос задан
  • 69 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы