Как привязать свойство к 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.