Задать вопрос
SpacePurr
@SpacePurr
c#, wpf

Как реализовать LazyLoad у TreeView?

Здравствуйте.

Давайте сразу, есть TreeView
<TreeView ItemsSource="{Binding MyObjects}" Grid.Row="0">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
                    <StackPanel Orientation="Horizontal">
                        <Image Source="/MyAddIn;component\Resources\treeEl.png" Stretch="Fill" Width="12" Height="12" RenderOptions.BitmapScalingMode="HighQuality"/>
                        <TextBlock Text="  " />
                        <TextBlock Text="{Binding Description}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>


TreeView привязано к коллекции MyObjects, состоящей из элементов MyObject, которая имеет поля
public string Description { get; set; }
public ObservableCollection<MyObject> Children { get; set; }


Коллекция MyObjects лежит в ViewModel и сейчас полностью заполняется рекурсивно, но так как объектов много, то это занимает значительное количество времени.

Я хочу, чтобы мое дерево заполнялось постепенно, т.е. при расширении элемента дерева, коллекция Children у объекта заполнялась новыми объектами.

Пытался реализовать и через TreeViewItem.Expander используя блендовские библиотеки Interactivity/Interactions, пытался реализовать через триггеры IsExpanded, IsSelected, также пытался реализовать это через модель поведения, которые отрыл в гугле, но у меня также ничего не заработало. Просто не ловится ничего из этого. На сколько я понял, связано это с тем, что HierarchicalDataTemplate не работает напрямую с TreeViewItem или как то так(знаний у меня не хватает).

Остался последний непроверенный мной вариант, использовать свойство IsChecked у ToggleButton, коим является сам Expander у элемента дерева, но это опять же создание стиля ToggleButton и все такое.
Мне кажется, что это можно реализовать не трогая этот элемент.

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

Не драматизируя скажу: "па-ма-гити".

Спасибо.
  • Вопрос задан
  • 109 просмотров
Подписаться 2 Средний 3 комментария
Решения вопроса 1
cyber_roach
@cyber_roach
UX дизайнер INEDIapps
Чем пример с MSDN не устроил ?
https://docs.microsoft.com/ru-ru/dotnet/framework/...

Есть момент - при наличии некоторых условий виртуализация отключается:
- если контейнеры элементов добавляются напрямую к элементу управления ItemsControl.
- если объект ItemsControl содержит контейнеры элементов различных типов.
- если для прикрепленного свойства VirtualizingStackPanel.IsVirtualizing установлено значение false
- если для прикрепленного свойства ScrollViewer.CanContentScroll установлено значение false

Можно еще взять любой пакет контролов где это реализовано (например Telerik)
Подсмотреть в их исходниках реализацию виртуализации и сделать свою в преферансом и дамами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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