Загрузка дочерних узлов при расширении родительского узла в TreeView через свойство IsExpanded - PullRequest
0 голосов
/ 02 июня 2010

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

Что касается загрузки товаров по требованию, она уже работает нормально. У меня есть подкласс TreeViewItem, и всякий раз, когда происходит событие «Expanded», мой TreeViewItemSource выбирает следующие несколько узлов.

Но это немного грязно, так как у меня есть собственный TreeViewItem, и, поскольку я добавляю элементы через TreeView.Items.Add (), я теряю возможность определять представление моих узлов в XAML.

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

Итак, к чему сводится мой вопрос: нельзя ли связать свойство IsExpanded без "трюка" от Bea Stollnitz?

Вот как я предполагал, что это будет работать, но это не так:

  <sdk:TreeView Name="treeView1">
    <Style TargetType="sdk:TreeViewItem">                    
      <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
    </Style>
    <sdk:TreeView.ItemTemplate>
      <sdk:HierarchicalDataTemplate ItemsSource="{Binding Children}" >
        <TextBlock Text="{Binding Path=Label, Mode=OneWay}" />
      </sdk:HierarchicalDataTemplate>
    </sdk:TreeView.ItemTemplate>
  </sdk:TreeView>

Так что, если бы я мог связываться с IsExpanded, я мог бы получать новые узлы всякий раз, когда родительский узел был раскрыт.

Что я делаю не так? Разве это не было бы лучшим решением проблемы? Есть новые идеи?

Просто чтобы прояснить: идеальным сценарием было бы то, что я мог бы взять кучу POCO (например, с меткой и значком) из веб-сервиса и выполнить всю стилизацию через XAML. Желательно, чтобы мне не приходилось помещать их во что-то еще, так как это очень медленно (по крайней мере, в моей текущей реализации, около 1000 элементов, прокрутка выглядит очень плохо).

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июня 2010

Один из способов сделать это - написать прикрепленное поведение, которое прослушивает событие Expanded и затем загружает данные. Таким образом, вы не создаете подкласс TreeViewItem и по-прежнему записываете весь макет в XAML, но вы все равно можете получить желаемое поведение динамической загрузки.

Редактировать

Примерно так (скорее всего, не компилируется, но должно дать вам представление)

public class LoadDynamicBehavior : Behavior<TreeViewItem>
{
    protected override void OnAttached()
    {
        AssociatedObject.Expanded += LoadData;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Expanded -= LoadData;
    }

    private void LoadData(object sender, EventArgs e)
    {
        // Load the correct data here and push it into AssociatedObject
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...