如何在 WinUI3 中将属性绑定到 TreeViewItem.IsSelected?
Posted
技术标签:
【中文标题】如何在 WinUI3 中将属性绑定到 TreeViewItem.IsSelected?【英文标题】:How to bind a property to TreeViewItem.IsSelected in WinUI3? 【发布时间】:2021-12-28 21:22:11 【问题描述】:我正在尝试在 WinUI3 桌面应用程序中动态生成树视图。它可以生成树,但默认情况下所有节点都未选中。我的应用程序需要记住选择并复制以前的状态。
从技术上讲,我可以从TreeView.SelectedNodes
读取选择状态。但是我无法找到从代码中选择节点的方法。
我在网上找到了几篇关于 WPF 或 UWP 的相关文章,但没有针对 WinUI3。
环境
WinUI3 桌面 Windows 应用 SDK 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
【讨论】:
以上是关于如何在 WinUI3 中将属性绑定到 TreeViewItem.IsSelected?的主要内容,如果未能解决你的问题,请参考以下文章
如何绑定到 ListView 中的模型而不是 WinUI3 中的属性?
在 C# 中将 WPF 属性绑定到 ApplicationSettings 的最佳方法?