簡體   English   中英

樹視圖中的 WPF ListView 選擇我需要在選擇更改事件中獲取所有選定的 ListView 項目(按住 CTRL 鍵時)

[英]WPF ListView Selection inside a treeview I Need to get all the selected ListView Items(when Holding CTRL key) in selection changed event

WPF 新手

這是 Xaml 代碼需要獲取所有選定的 ListView 項目到選擇更改事件

我試圖與 Multiselecttreeview nuget 一起工作,但問題是在這種情況下父母和孩子都是一樣的。 TreeviewEX 也做同樣的事情。任何幫助都會很棒。

                <Window x:Class="DemoApps.MainWindow"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    xmlns:local="clr-namespace:DemoApps"
                    mc:Ignorable="d"
                    Title="MainWindow" Height="350" Width="525">
                <Grid>

                    <TreeView x:Name="TreeViewList" Loaded="TreeViewList_Loaded">

                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate DataType="{x:Type local:Group}" ItemsSource="{Binding Users}" >
                                <Grid Width="200" Height="auto">
                                    <StackPanel>
                                        <TextBlock Text="{Binding GroupName}"/>
                                    </StackPanel>
                                </Grid>

                                <HierarchicalDataTemplate.ItemTemplate>
                                    <DataTemplate DataType="{x:Type local:User}">
                                        <ListView SelectionMode="Extended" SelectionChanged="ListView_SelectionChanged">
                                            <Grid Width="150" Height="20">
                                                <StackPanel>
                                                    <TextBlock Text="{Binding UserName}" />
                                                </StackPanel>
                                            </Grid>
                                        </ListView>
                                    </DataTemplate>
                                </HierarchicalDataTemplate.ItemTemplate>
                            </HierarchicalDataTemplate>


                        </TreeView.ItemTemplate>
                        <TreeView.ItemContainerStyle>
                            <Style TargetType="TreeViewItem">

                                <Setter Property="IsSelected" Value="{Binding IsSelected}" />
                                <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
                            </Style>
                        </TreeView.ItemContainerStyle>
                    </TreeView>

                </Grid>
            </Window>

這是我背后的代碼

                using System.Collections.ObjectModel;
            using System.ComponentModel;
            using System.Windows;
            using System.Windows.Controls;

            namespace DemoApps
            {
                /// <summary>
                /// Interaction logic for MainWindow.xaml
                /// </summary>
                public partial class MainWindow : Window
                {

                    public ObservableCollection<Group> GroupData { get; set; }
                    public MainWindow()
                    {
                        InitializeComponent();

                        GroupData = GetDummyData();

                    }

                    private ObservableCollection<Group> GetDummyData()
                    {
                        var _group = new ObservableCollection<Group>();

                        for (int i = 0; i < 20; i++)
                        {
                            _group.Add(new Group
                            {

                                GroupName = "Group name" + i,
                                Users = GetDummyUsers(i)

                            });
                        }
                        return _group;
                    }

                    private ObservableCollection<User> GetDummyUsers(int i)
                    {
                        var _user = new ObservableCollection<User>();
                        for (int j = 0; j < 10; j++)
                        {
                            _user.Add(new User
                            {

                                UserName = "User " + i + "-" + j
                            });

                        }
                        return _user;

                    }

                    private void TreeViewList_Loaded(object sender, RoutedEventArgs e)
                    {
                        TreeViewList.ItemsSource = GroupData;
                    }

                    private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
                    {
                        //Need to get all selected items from List View.
                        //Here i need to get the selected items
                    }
                }

                public class Group : TreeViewItemBase
                {

                    public string GroupName { get; set; }

                    public ObservableCollection<User> Users { get; set; }
                }

                public class User
                {

                    public string UserName { get; set; }
                }

                public class TreeViewItemBase : INotifyPropertyChanged
                {
                    private bool isSelected;
                    public bool IsSelected
                    {
                        get { return this.isSelected; }
                        set
                        {

                            this.isSelected = value;
                            NotifyPropertyChanged("IsSelected");

                        }
                    }

                    private bool isExpanded;
                    public bool IsExpanded
                    {
                        get { return this.isExpanded; }
                        set
                        {

                            this.isExpanded = value;
                            NotifyPropertyChanged("IsExpanded");
                        }
                    }




                    public event PropertyChangedEventHandler PropertyChanged;

                    public void NotifyPropertyChanged(string propName)
                    {
                        if (this.PropertyChanged != null)
                            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
                    }

                }
            }

如何將 ListView 的所有選定項放入選擇更改事件中

問題在於以下數據模板:

<HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:User}">
                        <ListView SelectionMode="Extended" SelectionChanged="ListView_SelectionChanged">
                            <Grid Width="150" Height="20">
                                <StackPanel>
                                    <TextBlock Text="{Binding UserName}" />
                                </StackPanel>
                            </Grid>
                        </ListView>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>

它為每個項目創建一個 ListView,因此只能選擇一個項目。

更改 XAML 以在 ListView 中顯示所有用戶

<Window x:Class="DemoApps.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView x:Name="TreeViewList" Loaded="TreeViewList_Loaded">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding GroupName}"/>
                        <ListView SelectionMode="Extended" SelectionChanged="ListView_SelectionChanged"
                                  ItemsSource="{Binding Users}">
                        </ListView>
                    </StackPanel>
                </DataTemplate>
            </TreeView.ItemTemplate>
            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">

                    <Setter Property="IsSelected" Value="{Binding IsSelected}" />
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
                </Style>
            </TreeView.ItemContainerStyle>
        </TreeView>
    </Grid>
</Window>

使用

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectedItems = ((ListView) e.Source).SelectedItems;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM