UWP从TreeView控件获取选定的节点

时间:2019-06-26 06:49:58

标签: .net xaml uwp

如何从@override Widget build(BuildContext context){ return Column( children: <Widget>[ _createWidget(() => FirstWidget()), _createWidget(() => SecondWidget()), ], ); } Widget _createWidget(Widget Function() widgetBuilder) { // ... other stuff... return widgetBuilder(); } 控件中获取当前突出显示/选定的节点?根据文档here,应该可以遍历控件的TreeView属性,但该属性始终为空。


编辑:事实证明,这是XAML的实际错误,由here跟踪。在解决之前,可以接受的答案可以很好地解决。


上下文:我正在开发一个简单的演示应用程序,以探索SelectedNodes控件。我正在尝试添加键盘快捷键以删除当前活动/选定的节点。我在实现TreeView的RelayCommand类中具有删除功能。我已经从ICommand TreeViewItem作为按钮和弹出菜单使用了它。我找不到在键盘快捷键中重用DataTemplate的干净方法。

应用的图片,突出显示了最后单击的项目;我需要在后面的代码中访问此TreeViewItem,以便在TreeView具有焦点并按下“删除”键时可以将其删除。 TreeViewExample

我在ICommand控件上有一个事件处理程序:

TreeView

事件处理程序应该遍历选定的节点,尽管我认为使用<controls:TreeView x:Name="TreeDataBound" ItemsSource="{Binding Path=TreeSource, Mode=TwoWay}" ItemTemplateSelector="{StaticResource TreeItemTemplateSelector}" SelectionMode="Single" KeyDown="Tree_KeyDown"> 时,可枚举应该只有一项。

SelectionMode="Single"

private void Tree_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == Windows.System.VirtualKey.Delete) { foreach (var element in TreeDataBound.SelectedNodes) { // Delete the item } } } 似乎始终为空,即使突出显示了TreeView元素之一。在调试器中,SelectedNodes显示为SelectedNodes类型,没有可访问的属性,因此我无法对其进行进一步检查。

对更好的方法有任何想法或建议吗?

2 个答案:

答案 0 :(得分:0)

  

UWP从TreeView控件中获取选定的节点

用于单选模式。 TreeViewItem包含IsSelected属性,您可以使用IsSelected创建模型类并将其绑定。选定项目IsSelected的值将被更改,因此您可以为每个项目源输入然后删除选定的项目。请参考以下步骤。

背后的代码

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        DataSource = GetData();
    }
    private ObservableCollection<ExplorerItem> DataSource;
    private ObservableCollection<ExplorerItem> GetData()
    {
        var list = new ObservableCollection<ExplorerItem>();
        ExplorerItem folder1 = new ExplorerItem()
        {
            Name = "Work Documents",
            Type = ExplorerItem.ExplorerItemType.Folder,
            Children =
            {
                new ExplorerItem()
                {
                    Name = "Functional Specifications",
                    Type = ExplorerItem.ExplorerItemType.Folder,
                    Children =
                    {
                        new ExplorerItem()
                        {
                            Name = "TreeView spec",
                            Type = ExplorerItem.ExplorerItemType.File,
                          }
                    }
                },
                new ExplorerItem()
                {
                    Name = "Feature Schedule",
                    Type = ExplorerItem.ExplorerItemType.File,
                },
                new ExplorerItem()
                {
                    Name = "Overall Project Plan",
                    Type = ExplorerItem.ExplorerItemType.File,
                },
                new ExplorerItem()
                {
                    Name = "Feature Resources Allocation",
                    Type = ExplorerItem.ExplorerItemType.File,
                }
            }
        };
        ExplorerItem folder2 = new ExplorerItem()
        {
            Name = "Personal Folder",
            Type = ExplorerItem.ExplorerItemType.Folder,
            Children =
                    {
                        new ExplorerItem()
                        {
                            Name = "Home Remodel Folder",
                            Type = ExplorerItem.ExplorerItemType.Folder,
                            Children =
                            {
                                new ExplorerItem()
                                {
                                    Name = "Contractor Contact Info",
                                    Type = ExplorerItem.ExplorerItemType.File,
                                },
                                new ExplorerItem()
                                {
                                    Name = "Paint Color Scheme",
                                    Type = ExplorerItem.ExplorerItemType.File,
                                },
                                new ExplorerItem()
                                {
                                    Name = "Flooring Woodgrain type",
                                    Type = ExplorerItem.ExplorerItemType.File,
                                },
                                new ExplorerItem()
                                {
                                    Name = "Kitchen Cabinet Style",
                                    Type = ExplorerItem.ExplorerItemType.File,
                                }
                            }
                        }
                    }
        };

        list.Add(folder1);
        list.Add(folder2);
        return list;
    }

    private void Tree_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Delete)
        {
             DeleteSelectItem(DataSource);
        }

    }
    private ExplorerItem DeleteSelectItem(ObservableCollection<ExplorerItem> DataSource)
    {
        foreach (var item in DataSource)
        {
            if (item.IsSelected == true)
            {
                DataSource.Remove(item);
                return item;
            }

            var FindResult = DeleteSelectItem(item.Children);
            if (FindResult != null)
                return FindResult;
        }

        return null;
    }
}
public class ExplorerItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public enum ExplorerItemType { Folder, File };
    public String Name { get; set; }
    public ExplorerItemType Type { get; set; }
    private ObservableCollection<ExplorerItem> m_children;
    public ObservableCollection<ExplorerItem> Children
    {
        get
        {
            if (m_children == null)
            {
                m_children = new ObservableCollection<ExplorerItem>();
            }
            return m_children;
        }
        set
        {
            m_children = value;
        }
    }

    private bool m_isExpanded;
    public bool IsExpanded
    {
        get { return m_isExpanded; }
        set
        {
            if (m_isExpanded != value)
            {
                m_isExpanded = value;
                NotifyPropertyChanged("IsExpanded");
            }
        }
    }

    private bool m_isSelected;
    public bool IsSelected
    {
        get { return m_isSelected; }

        set
        {
            if (m_isSelected != value)
            {
                m_isSelected = value;
                NotifyPropertyChanged("IsSelected");
            }
        }

    }

    private void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

class ExplorerItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate FolderTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        var explorerItem = (ExplorerItem)item;
        return explorerItem.Type == ExplorerItem.ExplorerItemType.Folder ? FolderTemplate : FileTemplate;
    }
}

Xaml

<Page.Resources>
    <DataTemplate x:Key="FolderTemplate" x:DataType="local:ExplorerItem">
        <TreeViewItem
            AutomationProperties.Name="{x:Bind Name}"
            IsExpanded="{x:Bind IsExpanded,Mode=TwoWay}"
            IsSelected="{x:Bind IsSelected,Mode=TwoWay}"
            ItemsSource="{x:Bind Children}"
            >

            <StackPanel Orientation="Horizontal">
                <Image Width="20" Source="../Assets/folder.png" />
                <TextBlock Margin="0,0,10,0" />
                <TextBlock Text="{x:Bind Name}" />
            </StackPanel>
        </TreeViewItem>
    </DataTemplate>

    <DataTemplate x:Key="FileTemplate" x:DataType="local:ExplorerItem">
        <TreeViewItem AutomationProperties.Name="{x:Bind Name}" IsSelected="{x:Bind IsSelected,Mode=TwoWay}">

            <StackPanel Orientation="Horizontal">
                <Image Width="20" Source="../Assets/file.png" />
                <TextBlock Margin="0,0,10,0" />
                <TextBlock Text="{x:Bind Name}" />
            </StackPanel>
        </TreeViewItem>
    </DataTemplate>

    <local:ExplorerItemTemplateSelector
        x:Key="ExpolrerItemTemplateSelector"
        FileTemplate="{StaticResource FileTemplate}"
        FolderTemplate="{StaticResource FolderTemplate}"
        />
</Page.Resources>
<Grid>
    <TreeView
        x:Name="TreeDataBound"
        HorizontalAlignment="Center"
        VerticalAlignment="Top"
        ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}"
        ItemsSource="{x:Bind DataSource,Mode=OneWay}"
        KeyDown="Tree_KeyDown"
        SelectionMode="Single"
        />
</Grid>

有关完整的代码示例,请参阅此link

答案 1 :(得分:0)

此问题已得到解决,但在您照常创建 uwp 应用程序时并未“启用”。

您需要修改一些代码行以启用较新版本的 xaml。

首先,按照此页面上的说明进行操作:https://docs.microsoft.com/en-us/windows/apps/winui/winui2/getting-started .在您的项目中安装最新的包。

然后将 xmlns:muxc="using:Microsoft.UI.Xaml.Controls"using muxc = Microsoft.UI.Xaml.Controls; 添加到您想要使用来自最新包的新控件的任何 Xaml/CS 文件。 示例可以在 :https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/tree-view 中找到。 总之,将 muxc: 添加到每个 <TreeView> 中,使它们变为 <muxc:TreeView>(对于除数据模板之外的每个子项也是如此)。 然后在后面的 cs 代码中,使用 muxc.TreeViewxxx 而不是默认命名空间。

我不是 C# 或 VS 方面的专家,这个答案可以改进或有不必要的说明,但它现在对我有用。