UWP Получить выбранные узлы из элемента управления TreeView - PullRequest
1 голос
/ 26 июня 2019

Как получить выделенный / выбранный узел из элемента управления TreeView? На основании документации здесь должна быть возможность перебирать свойство SelectedNodes элемента управления, но оно всегда пустое.


РЕДАКТИРОВАТЬ: Оказывается, это настоящая ошибка с XAML, отслеживается здесь . Пока это не исправлено, принятый ответ работает как обходной путь.


Контекст: я работаю над простым демонстрационным приложением, чтобы изучить элемент управления TreeView. Я пытаюсь добавить сочетание клавиш для удаления текущего активного / выбранного узла. У меня есть функция удаления в классе RelayCommand, который реализует ICommand. Я уже получил, что это работает от TreeViewItem DataTemplate как кнопка и как всплывающее меню. Я не мог найти чистый способ повторно использовать ICommand в сочетаниях клавиш.

Изображение приложения с выделенным последним элементом; Мне нужно получить доступ к этому TreeViewItem в коде позади, чтобы я мог удалить его, когда TreeView имеет фокус и нажата клавиша «Удалить». TreeViewExample

У меня есть обработчик событий на 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 
        }
    }
}

SelectedNodes кажется всегда пустым, даже если выделен один из разделов TreeView. В отладчике SelectedNodes отображается как тип System.__ComObject без доступных свойств, поэтому я больше не могу его проверять.

Какие-нибудь мысли или предложения для лучшего подхода?

1 Ответ

0 голосов
/ 27 июня 2019

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>

Полный пример кода см. По ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...