ItemsControl的ListVIew:从ItemsControl中选择一项后,获取ListViewItem索引

时间:2018-08-08 04:59:52

标签: c# wpf listview

我有一个ListView。在此ListView内有ItemsControl,在它内有第二个ItemsControl。在第二个ItemsControl的内部有TextBoxes。

ListView-> ItemsControl-> ItemsControl-> TextBox

单击此TextBox后,是否有可能获取ListViewItem的索引(该特定TextBox属于哪个索引)?

例如

我在索引 0 上选择一个ListViewItem,但是然后单击属于索引 2 上ListViewItem的TextBox。在这种情况下,我想将 SelectedGroupIndex 的值从 0 更改为 2 。 “ Hello”字符串仅用于测试。

非常感谢您。

ViewModel

public class MainWindowViewModel
    {
        public ObservableCollection<ObservableCollection<ObservableCollection<ListViewString>>> AllTexts { get; set; }

        public int SelectedGroupIndex { get; set; }

        public ICommand AddGroup { get; private set; }

        public ICommand AddColumn { get; private set; }

        public ICommand TextBoxSelected { get; private set; }

        public MainWindowViewModel()
        {
            this.AllTexts = new ObservableCollection<ObservableCollection<ObservableCollection<ListViewString>>>();
            this.SelectedGroupIndex = -1;
            this.AddGroup = new Command(this.AddGroupCommandHandler);
            this.AddColumn = new Command(this.AddColumnCommandHandler);
            this.TextBoxSelected = new Command(this.TextBoxSelectedCommandHandler);
        }

        private void AddGroupCommandHandler()
        {
            var tempColumn = new ObservableCollection<ListViewString>() {
                this.GetListViewString("Hello"),
                this.GetListViewString("Hello"),
                this.GetListViewString("Hello"),
                this.GetListViewString("Hello"),
                this.GetListViewString("Hello") };
            var tempGroup = new ObservableCollection<ObservableCollection<ListViewString>>();
            tempGroup.Add(tempColumn);
            this.AllTexts.Add(new ObservableCollection<ObservableCollection<ListViewString>>(tempGroup));
        }

        private void AddColumnCommandHandler()
        {
           if (this.SelectedGroupIndex >= 0 && this.SelectedGroupIndex < this.AllTexts.Count)
           {
                var tempColumn = new ObservableCollection<ListViewString>() {
                    this.GetListViewString("Hello"),
                    this.GetListViewString("Hello"),
                    this.GetListViewString("Hello"),
                    this.GetListViewString("Hello"),
                    this.GetListViewString("Hello") };
                this.AllTexts[this.SelectedGroupIndex].Add(tempColumn);
           }
        }

        private void TextBoxSelectedCommandHandler()
        {
            // TODO: Change SelectedItem of ListView  

            // this.SelectedGroupIndex = ...;
        }

        private ListViewString GetListViewString(string text)
        {
            return new ListViewString { Value = text };
        }

        private string GetTextFromListViewString(ListViewString listViewString)
        {
            return listViewString.Value;
        }
    }

    /// <summary>
    /// Class used to show user Text in ListView.
    /// Using this class fixes the issue that ObservableCollection didn't update
    /// after user changed values of TextBoxes in GUI.
    /// </summary>
    public class ListViewString : DependencyObject
    {
        public string Value
        {
            get
            {
                return (string)GetValue(ValueProperty);
            }

            set
            {
                SetValue(ValueProperty, value);
            }
        }

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(string), typeof(ListViewString), new PropertyMetadata(string.Empty));
    }

查看:

<Window.Resources>
    <ResourceDictionary>
        <local:MainWindowViewModel x:Key="vm" />
    </ResourceDictionary>
</Window.Resources>

<Grid Margin="10,10,10,10" VerticalAlignment="Top">
    <Grid.RowDefinitions>
        <RowDefinition Height="300" />
        <RowDefinition />
    </Grid.RowDefinitions>

    <ListView Grid.Row="0"
    ItemsSource="{Binding AllTexts, Source={StaticResource vm}, Mode=TwoWay}"
    Background="Blue"
    SelectedIndex="{Binding SelectedGroupIndex, Source={StaticResource vm}}">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ItemsControl ItemsSource="{Binding}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <ItemsControl ItemsSource="{Binding}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Vertical" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <TextBox Text="{Binding Value}"
                                                VerticalContentAlignment="Center"
                                                HorizontalContentAlignment="Center"
                                                Width="100" Height="40">
                                            <TextBox.InputBindings>
                                                <MouseBinding Gesture="LeftClick"
                                                Command="{Binding TextBoxSelected, Source={StaticResource vm}}" />
                                            </TextBox.InputBindings>
                                        </TextBox>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

    <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,20,0,0">
        <Button Content="Add Group" Width="120" Height="30"
        Command="{Binding AddGroup, Source={StaticResource vm}}" />
        <Button Content="Add Column" Margin="20,0,0,0" Width="120" Height="30"
        Command="{Binding AddColumn, Source={StaticResource vm}}" />
        <TextBlock Width="120" Height="30" FontSize="20" Margin="20,0,0,0"
        Text="{Binding SelectedGroupIndex, Source={StaticResource vm}}" />
    </StackPanel>
</Grid>

1 个答案:

答案 0 :(得分:0)

实际上,您需要将DataContext的{​​{1}}作为参数传递给命令,因此使用TextBox并使用参数实现命令:

CommandParameter

因此,您将从项目源集合中获得一个项目作为命令参数,并可以找到它的索引。