Отсутствуют дочерние элементы при изменении ItemsSource TreeView - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть несколько ObservableCollections of Items с детьми. Я пытаюсь привязать TreeView к коллекции, где пользователь будет выбирать источник во время выполнения. Пользователь может перетаскивать список, чтобы реорганизовать / отредактировать коллекцию активных источников.

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

xaml:

<TreeView x:Name="ItemTree" ItemsSource="{Binding Items}">
  <TreeView.ItemTemplate>
    <DataTemplate>
      <TreeViewItem ItemsSource="{Binding Children}" Content="{Binding Name}"/>
    </DataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

xaml.cs

public sealed partial class MainPage : Page
{
  readonly private Source _source1, _source2, _source3;

  public MainPage()
  {
    this.InitializeComponent();
    _source1 = new Source("Source 1", 2);
    _source2 = new Source("Source 2", 3);
    _source3 = new Source("Source 3", 4);
  }

  private void ShowS1_Click(object sender, RoutedEventArgs e)
  {
    ItemTree.DataContext = _source1;
  }

  private void ShowS2_Click(object sender, RoutedEventArgs e)
  {
    ItemTree.DataContext = _source2;
  }

  private void ShowS3_Click(object sender, RoutedEventArgs e)
  {
    ItemTree.DataContext = _source3;
  }
}

public class Source
{
  public string Title { get; set; } = "Untitled";
  public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>();

  public Source(string title, int numItems)
  {
    Title = title;

    for (int i = 0; i < numItems; i++)
    {
      Items.Add(new Item("Item " + i, i + 1));
    }
  }
}

public class Item
{
  public string Name { get; set; } = "Item";
  public ObservableCollection<Item> Children { get; } = new ObservableCollection<Item>();

  public Item(string name, int numChildren)
  {
    Name = name;

    for (int i = 0; i < numChildren; i++)
    {
      Children.Add(new Item("Child " + i, 0));
    }
  }
}

Обновление: Временный обходной путь до тех пор, пока я не найду что-то более приятное, что работает в том, что мне нужно

Во-первых, я заметил, что коллекция даже не обновлялась из-за действий перетаскивания, носсылка на последнюю версию WinUI исправила это. Я также изменил привязки, чтобы использовать x: Bind.

Во-вторых, я смог заставить детей работать довольно грязно, очистив источник TreeView, обновив привязки, затем установив фиктивную коллекцию (с помощьюпо крайней мере 1 член, 0 приводит к тому, что по какой-то причине не удается загрузить только последние дочерние элементы), обновляет привязки, затем, наконец, устанавливает его для реального источника и обновляет привязки в последний раз. Асинхронные задержки были необходимы между каждым обновлением привязки, чтобы обновить TreeView. Недостатком этого является то, что он вводит кадр мерцания, когда источник пуст.

...