如何在 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 的最佳方法?

如何在 WinForms 中将字典绑定到 ListBox

绑定到可观察属性,但显示不可观察的子属性

将新项目添加到绑定的 ItemsSource 时,WinUI 3 UWP TabView 不显示新选项卡

WinUI 3 XAML DataTemplate - 如何包含由用于绑定的类公开的控件