Я могу связать WPF TreeView с единственным корневым узлом?

Скажите, что у меня есть двоичное дерево, где корень структуры данных является просто древовидным узлом. Для каждого узла дети доступны через Children свойство. Вот то, что я попробовал. TreeRoot свойство наследованного контекста данных, но это - единственный узел (не набор).

<UserControl.Resources>
    <HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
</UserControl.Resources>

<Grid>
    <TreeView ItemsSource="{Binding TreeRoot}" ItemTemplate="{StaticResource TreeNodeTemplate}" />
</Grid>
15
задан abatishchev 15 June 2012 в 14:34
поделиться

3 ответа

это должно сделать это

любой размер шахматной доски вы хотите (просто пройти по ширине и высоте, как w, h); также у меня есть жестко закодированная высота/ширина ячейки до 1, хотя, конечно, это также может быть параметризовано так, что произвольное значение передается в:

>>> import numpy as NP

>>> def build_checkerboard(w, h) :
      re = NP.r_[ w*[0,1] ]              # even-numbered rows
      ro = NP.r_[ w*[1,0] ]              # odd-numbered rows
      return NP.row_stack(h*(re, ro))


>>> checkerboard = build_checkerboard(5, 5)

>>> checkerboard
 Out[3]: array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])

с этим массивом 2D, это просто, чтобы визуализировать изображение шахматной доски, как так:

>>> import matplotlib.pyplot as PLT

>>> fig, ax = PLT.subplots()
>>> ax.imshow(checkerboard, cmap=PLT.cm.gray, interpolation='nearest')
>>> PLT.show()
-121--2111406-

Как сказал Ремус, если вы используете модель полного восстановления, то вещи сложны. Но даже при простой модели восстановления необходимо помнить, что CHECKPOINT вызывает сборщик мусора (GC), но это не гарантирует, что GC удалит все файлы в одном проходе. GC в настоящее время имеет ограничение на количество операций, которые он может выполнять в одном вызове. Кроме того, файлы удаляются с FILE_DELETE_ON_CLOSE опцией, поэтому при наличии открытых дескрипторов файла они будут отображаться, даже если GC, возможно, уже удалил его. Такие открытые дескрипторы могут храниться антивирусными программами или другими драйверами фильтра файловой системы.

Наконец, если у вас не будет места на диске, я бы не стал беспокоиться о устаревших файлах - они в конечном итоге будут удалены как часть автоматических контрольных точек базы данных. Я считаю (хотя полагают, что является ключевым словом здесь), что даже если это может иметь медленное «время запуска», GC будет идти в ногу с физическим удалением файлов, если вы продолжаете тест в течение более длительного периода времени (минут?).

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

-121--3690503-

Я думаю, что ваша проблема заключается в том, что ваш иерархический шаблон данных применяется только к корневому узлу, поэтому вы никогда не видите ничего за нижестоящими элементами корня. Попробуйте сделать следующее:

<UserControl.Resources>
    <HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
</UserControl.Resources>

<Grid>
    <TreeView ItemsSource="{Binding TreeRoot}"/>
</Grid>

Где TreeNode является именем класса узлов дерева.

4
ответ дан 1 December 2019 в 04:17
поделиться

Как сказал Aviad, если вы используете DataType = «{x: Type Treenode}» , то дерево автоматически использовал этот шаблон для любого объекта этого типа.

Если у вас есть несколько типов в своей иерархии, вы можете указать несколько иерархическихdateMplates каждый с типом данных. Это позволило бы сделать TreeView обрабатывать каждый тип по-разному.

<HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}">
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

<HierarchicalDataTemplate DataType="{x:Type TreeLeaf}">
    <TextBlock Text="{Binding Message}" Background="Red" />
</HierarchicalDataTemplate>
3
ответ дан 1 December 2019 в 04:17
поделиться

У меня возникла эта проблема, и я пришел к выводу, что я не могу привязать не-коллекцию к древовидной структуре как способ указать корневой узел. Итак, я сделал быстрое изменение в моем ModelView и сделал свойство, представляющее корневой узел, коллекцией из 1 элемента.

public class ContainerViewModel
{
   public ObservableCollection<TreeNodeViewModel> RootNodes { get; private set; }

   public ContainerViewModel()
   {
      // Create a single node in the collection of root nodes
      RootNodes = new ObservableCollection<TreeNodeViewModel>();
      RootNodes.Add(new TreeNodeViewModel());
   }
}

public class TreeNodeViewModel
{
   public ObservableCollection<TreeNodeViewModel> Children { get; set; }
}

Я использовал ObservableCollection <> выше, но, возможно, имеет смысл использовать что-то более дешевое, например List <>, поскольку вы не ожидаете, что коллекция изменится (по крайней мере, в вашем сценарии).

9
ответ дан 1 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

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