У меня есть несколько 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. Недостатком этого является то, что он вводит кадр мерцания, когда источник пуст.