логика такая: в логгер прилетает событие вида
$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;
}
}