Mahesh
Mahesh

Reputation: 11

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

New to WPF

This is Xaml code Need to Get All Selected ListView Items onto selection changed event

I Tried to work with Multiselecttreeview nuget but the problem is both parent and child are same in that case . Also TreeviewEX does the same .Any help would be great.

                <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>

This is my code behind

                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));
                    }

                }
            }

How can get all the selected Items of ListView into Selection changed event

Upvotes: 1

Views: 293

Answers (1)

Matt Norrie
Matt Norrie

Reputation: 666

The issue is with the data template below:

<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>

It is creating a ListView per item so only one item can ever be selected.

Change the XAML to display all the users in a 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>

Get the selected items using

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

Upvotes: 1

Related Questions