Как привязать свойство к TreeViewItem.IsSelected в WinUI3?

Я пытаюсь динамически создать древовидное представление в настольном приложении WinUI3. Он может сгенерировать дерево, но по умолчанию все узлы не выбраны. Моему приложению необходимо запомнить выбор и воспроизвести предыдущий статус.

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

Я нашел в сети пару статей по WPF или UWP, но не по WinUI3.

Среда

  • Рабочий стол WinUI3
  • Пакет SDK для приложений Windows 1.0.0
  • MvvmGen 1.1.2

Цель

  • Выберите некоторые элементы в дереве при запуске.
  • Прочтите статус выбора из ViewModel.

Проблема

  • Невозможно привязать свойство IsSelected в представлении к ListViewItem.IsSelected.

Код

      MainWindow.xaml

<Window
    x:Class="WinUITreeViewTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:WinUITreeViewTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel DataContext="MainWindowViewModel">
        <TreeView Name="MyItemView" SelectionMode="Multiple" ItemsSource="{Binding MyItems}">
            <TreeView.ItemTemplate>
                <DataTemplate x:DataType="local:MyItem">
                    <TreeViewItem ItemsSource="{Binding Children}" Content="{Binding Name}" IsExpanded="{Binding IsExpanded}" IsSelected="{Binding IsSelected}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </StackPanel>
</Window>

в TreeViewItem узел, он предназначен для привязки MyItem.IsSelected к TreeViewItem.IsSelcted. Не работает.

      MainWindow.xaml.cs

public sealed partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();

        ViewModel = new MainWindowViewModel();
        MyItemView.DataContext = ViewModel;

        ObservableCollection<MyItem> root = new ObservableCollection<MyItem>();

        MyItem item1 = new MyItem() { Name = "Item1", IsExpanded=true };
        root.Add(item1);
        item1.Children.Add(new MyItem() { Name = "Item1.1" });
        item1.Children.Add(new MyItem() { Name = "Item1.2" });
        item1.Children.Add(new MyItem() { Name = "Item1.3", IsSelected=true });

        MyItem item2 = new MyItem() { Name = "Item2", IsExpanded = true };
        root.Add(item2);
        item2.Children.Add(new MyItem() { Name = "Item2.1" });
        item2.Children.Add(new MyItem() { Name = "Item2.2" });
        item2.Children.Add(new MyItem() { Name = "Item2.3" });

        MyItem item3 = new MyItem() { Name = "Item3", IsExpanded = true };
        root.Add(item3);
        item3.Children.Add(new MyItem() { Name = "Item3.1" });
        item3.Children.Add(new MyItem() { Name = "Item3.2" });
        item3.Children.Add(new MyItem() { Name = "Item3.3" });

        ViewModel.MyItems = root;
    }

    MainWindowViewModel ViewModel;
}
      MainWindowViewModel.cs

[ViewModel]
public partial class MainWindowViewModel
{
    [Property]
    ObservableCollection<MyItem> myItems;
}

[ViewModel]
public partial class MyItem
{
    [Property]
    private string name;

    public override string ToString() => Name;

    [Property]
    private bool? isSelected;

    [Property]
    private bool isExpanded;

    [Property]
    private ObservableCollection<MyItem> children = new ObservableCollection<MyItem>();
}

MvvmGen автоматически генерирует соответствующее свойство для MVVM, как это.

      public bool? IsSelected
{
    get => isSelected;
    set
    {
        if (isSelected != value)
        {
            isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }
}

Ссылка: https://github.com/hayashida-katsutoshi/WinUITreeViewTest

1 ответ

Это была известная проблема. Я нашел билет в GitHub.

https://github.com/microsoft/microsoft-ui-xaml/issues/125

Другие вопросы по тегам