Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在单击按钮时获取ListView行的索引_C#_Wpf - Fatal编程技术网

C# 如何在单击按钮时获取ListView行的索引

C# 如何在单击按钮时获取ListView行的索引,c#,wpf,C#,Wpf,我正在制作一个wpf应用程序,遇到了一个问题。 我使用了一个listview,并通过Xaml在其中添加了一个按钮 <ListView x:Name="list_View" Grid.Column="2" Margin="0,0,0,53" Grid.Row="1" MouseDoubleClick="list_View_MouseDoubleClick" ItemContainerStyle="{DynamicResource alternatingListViewItemStyle}"

我正在制作一个wpf应用程序,遇到了一个问题。 我使用了一个listview,并通过Xaml在其中添加了一个按钮

 <ListView x:Name="list_View" Grid.Column="2" Margin="0,0,0,53" Grid.Row="1" MouseDoubleClick="list_View_MouseDoubleClick" ItemContainerStyle="{DynamicResource alternatingListViewItemStyle}" AlternationCount="2">
        <ListView.Style>
            <Style TargetType="{x:Type ListView}">
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="2"/>
                <Setter Property="Margin" Value="0"/>
            </Style>
        </ListView.Style>
        <ListView.Resources>
            <Style x:Key="alternatingListViewItemStyle" TargetType="{x:Type ListViewItem}">
                <!-- setting row height here -->
                <Setter Property="Height" Value="30" />
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="Background" Value="#E7F8FE"/>

            </Style>

        </ListView.Resources>

        <ListView.View>

            <GridView>
                <GridViewColumn Header="Product Name"  Width="100"  DisplayMemberBinding="{Binding Product_Name}"/>
                <GridViewColumn Header="Unit Price" Width="70" DisplayMemberBinding="{Binding Unit_Price}"/>
                <GridViewColumn Header="Quantity" Width="50" DisplayMemberBinding="{Binding Quantity}"/>
                <GridViewColumn Header="Total"  Width="60" DisplayMemberBinding="{Binding Total}"  />
                <GridViewColumn Header="Delete"  Width="60">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="X" Width="30" Click="Delete_Item_In_Cart_Click" Name="btn_Delete_Item_In_Cart">

                            </Button>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>
    </ListView>
**问题:*当我点击listview任意一行的按钮时,它总是给我相同的索引, 我得到的输出是:


提前感谢

您当前的程序正在返回所选行的索引。单击按钮时,将不会选中该行。要获得所需的结果,请单击按钮上的行

下面是单击按钮时选择行的代码

代码隐藏:

private void DeleteListItem(object sender, RoutedEventArgs e)
{
  var curItem = ((ListBoxItem)listView.ContainerFromElement((Button)sender));
  listView.SelectedItem = (ListBoxItem)curItem;
  MessageBox.Show($"Selected index = {listView.SelectedIndex}");

  // Add code for delete item here
}
XAML-列表视图示例代码:

<ListView x:Name="listView" HorizontalAlignment="Left" Height="301" Margin="10,10,0,0" VerticalAlignment="Top" Width="400">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID"  Width="100" DisplayMemberBinding="{Binding ID}"/>
            <GridViewColumn Header="Name"  Width="190" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Delete"  Width="100">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="X" Width="30" Click="DeleteListItem"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
    <ListViewItem>
        <local:User ID="1" Name="John" />
    </ListViewItem>
    <ListViewItem>
        <local:User ID="2" Name="Michael" />
    </ListViewItem>
    <ListViewItem>
        <local:User ID="3" Name="Smith" />
    </ListViewItem>
    <ListViewItem>
        <local:User ID="4" Name="Mary" />
    </ListViewItem>
</ListView>

当前程序正在返回所选行的索引。单击按钮时,将不会选中该行。要获得所需的结果,请单击按钮上的行

下面是单击按钮时选择行的代码

代码隐藏:

private void DeleteListItem(object sender, RoutedEventArgs e)
{
  var curItem = ((ListBoxItem)listView.ContainerFromElement((Button)sender));
  listView.SelectedItem = (ListBoxItem)curItem;
  MessageBox.Show($"Selected index = {listView.SelectedIndex}");

  // Add code for delete item here
}
XAML-列表视图示例代码:

<ListView x:Name="listView" HorizontalAlignment="Left" Height="301" Margin="10,10,0,0" VerticalAlignment="Top" Width="400">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID"  Width="100" DisplayMemberBinding="{Binding ID}"/>
            <GridViewColumn Header="Name"  Width="190" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Delete"  Width="100">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="X" Width="30" Click="DeleteListItem"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
    <ListViewItem>
        <local:User ID="1" Name="John" />
    </ListViewItem>
    <ListViewItem>
        <local:User ID="2" Name="Michael" />
    </ListViewItem>
    <ListViewItem>
        <local:User ID="3" Name="Smith" />
    </ListViewItem>
    <ListViewItem>
        <local:User ID="4" Name="Mary" />
    </ListViewItem>
</ListView>

我终于解决了我的问题。以下是我遵循的解决方案和流程

1:首先,我在

3:现在获取所选
ListView
行的索引对我来说非常简单。而按钮点击后的旧代码对我来说非常有效

最后,我给出了所有经过充分测试且无错误的代码

1:Xaml: 这是
ListView的代码

 <ListView x:Name="list_View" Grid.Column="2" Grid.Row="1" Margin="0,0,0,103">

        <ListView.Style>
            <Style TargetType="{x:Type ListView}">

                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="2"/>
                <Setter Property="Margin" Value="0"/>
            </Style>
        </ListView.Style>
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="IsSelected" Value="True"/>

                    </Trigger>
                </Style.Triggers>
                <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
                <Setter Property="Height" Value="30" />
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="Background" Value="#E7F8FE"/>
            </Style>

        </ListView.Resources>

        <ListView.View>

            <GridView>
                <GridViewColumn Header="Product Name"  Width="120"  DisplayMemberBinding="{Binding Product_Name}"/>
                <GridViewColumn Header="Unit Price" Width="70" DisplayMemberBinding="{Binding Unit_Price}"/>
                <GridViewColumn Header="Quantity" Width="50" DisplayMemberBinding="{Binding Quantity}"/>
                <GridViewColumn Header="Total"  Width="60" DisplayMemberBinding="{Binding Total}"  />
                <GridViewColumn Header="Delete"  Width="80">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="X" Width="60" Click="Delete_Item_In_Cart_Click" Name="btn_Delete_Item_In_Cart" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

                            </Button>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>

    </ListView>

我终于解决了我的问题。以下是我遵循的解决方案和流程

1:首先,我在

3:现在获取所选
ListView
行的索引对我来说非常简单。而按钮点击后的旧代码对我来说非常有效

最后,我给出了所有经过充分测试且无错误的代码

1:Xaml: 这是
ListView的代码

 <ListView x:Name="list_View" Grid.Column="2" Grid.Row="1" Margin="0,0,0,103">

        <ListView.Style>
            <Style TargetType="{x:Type ListView}">

                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="2"/>
                <Setter Property="Margin" Value="0"/>
            </Style>
        </ListView.Style>
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="IsSelected" Value="True"/>

                    </Trigger>
                </Style.Triggers>
                <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
                <Setter Property="Height" Value="30" />
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="Background" Value="#E7F8FE"/>
            </Style>

        </ListView.Resources>

        <ListView.View>

            <GridView>
                <GridViewColumn Header="Product Name"  Width="120"  DisplayMemberBinding="{Binding Product_Name}"/>
                <GridViewColumn Header="Unit Price" Width="70" DisplayMemberBinding="{Binding Unit_Price}"/>
                <GridViewColumn Header="Quantity" Width="50" DisplayMemberBinding="{Binding Quantity}"/>
                <GridViewColumn Header="Total"  Width="60" DisplayMemberBinding="{Binding Total}"  />
                <GridViewColumn Header="Delete"  Width="80">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="X" Width="60" Click="Delete_Item_In_Cart_Click" Name="btn_Delete_Item_In_Cart" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

                            </Button>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>

    </ListView>

在MVVM中,您应该使用
RowStyle
bind
所选项目,而不是从events/codebeard中获取。当您尝试list\u View.SelectedItems.count时,您是否可以获取总计数?请您介绍一下如何使用MVVM@LeiYang执行此操作。您可以尝试一下吗不是如何选择行。在MVVM中,你应该使用
RowStyle
bind
所选项目,而不是从events/codebeard获取。当你尝试list\u View.SelectedItems.count时,你是否获得总计数?你能告诉我如何使用MVVM@LeiYang执行此操作吗?你能尝试一下吗获取所选索引,而不是如何选择行。但如何在单击按钮时选择行是主要问题。你能告诉我怎么做吗?恭喜你,你已经找到了答案。我已经在我的答案中添加了另一个解决方案。但是如何在点击按钮时选择行是主要问题。你能告诉我怎么做吗?恭喜你,你已经找到了答案。我在我的回答中添加了一个替代解决方案。
    private void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
    {
        ListViewItem item = (ListViewItem)sender;
        item.IsSelected = true;

    }

private void Delete_Item_In_Cart_Click(object sender, RoutedEventArgs e)
{
    try
    {   
        int index =0;
        index = list_View.SelectedIndex;
        MessageBox.Show(index.ToString());

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }  

}