c# - 通过按钮在 ListView 中进行单选

标签 c# wpf xaml listview selection

目标:
需要在 ListView 中选择单行包含按钮。

问题:
当您单击位于 ListView 内部的按钮时,不知道如何在 ListView 中进行单个选择。在一个简单的解释中,当点击按钮时,不会在 ListView 的行中应用任何选择

如果在进入按钮的方法之前应用选择会很棒,因为我需要从应该发送到业务逻辑的 ListView 的单个选择中获取信息。


private void btnBuy_Click(object sender, RoutedEventArgs e)
{

}
<ListView Height="242.47" Canvas.Left="8" Canvas.Top="49.53" Width="435.22" Name="lstOrder" ItemsSource="{Binding}"
        PreviewMouseLeftButtonUp="lstOrder_PreviewMouseLeftButtonUp" SelectionChanged="lstOrder_SelectionChanged"
        SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Article Number" Width="auto" DisplayMemberBinding="{Binding Path=_articleNumber}"
                    TextBlock.TextAlignment="Left"
                    HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" />
            <GridViewColumn Header="Name" Width="auto" DisplayMemberBinding="{Binding Path=_name}"
                    TextBlock.TextAlignment="Left"
                    HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" />
            <GridViewColumn Header="Sale Price" Width="auto" DisplayMemberBinding="{Binding Path=_salePrice}"
                    TextBlock.TextAlignment="Left"
                    HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" />
            <GridViewColumn Header="Product Category" Width="auto"
                    DisplayMemberBinding="{Binding Path=_productCategory}" TextBlock.TextAlignment="Left"
                    HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" />
            <GridViewColumn Header="Quantity" Width="auto" DisplayMemberBinding="{Binding Path=_quantity}"
                    TextBlock.TextAlignment="Left"
                    HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" />
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Name="btnBuy" MinHeight="20" MinWidth="50" Content="Buy" Click="btnBuy_Click" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

namespace MediaStore
{
    /// <summary>
    /// Interaction logic for Counter.xaml
    /// </summary>
    public partial class Counter : Window
    {
        private ManagerProduct _myManagerProduct;
        private ManagerCart _myManagerCart;

    public Counter(ManagerProduct pManagerProduct, ManagerCart pMyManagerCart)
    {
        this.InitializeComponent();

        _myManagerProduct = pManagerProduct;
        _myManagerCart = pMyManagerCart;


        lstOrder.AddHandler(ListViewItem.UnselectedEvent, new RoutedEventHandler(ItemSelected), true);


        UpDateGUI();
    }


    public void UpDateGUI()
    {
        FillDataInListView();
    }

    private void FillDataInListView()
    {
        lstOrder.DataContext = _myManagerProduct.GetAllProductList();
    }

    #region Tab Order - 1. Order

    private void btnBuy_Click(object sender, RoutedEventArgs e)
    {

    }

    private void btnDisplayCart_Click(object sender, RoutedEventArgs e)
    {

    }

    private void btnCheckout_Click(object sender, RoutedEventArgs e)
    {
        cvsOrder.Visibility = Visibility.Hidden;

        cvsConfirmation.Margin = new Thickness(8, 8, 8, 17);
    }

    private void lstOrder_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {


    }


    private void ItemSelected(object sender, RoutedEventArgs e)
    {

    }


    private void lstOrder_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }
    #endregion

    }

}

最佳答案

您不需要选择 ListViewItem,您可以从 ButtonDataContext 中获取数据对象,并且不需要其他行的数据,因为您无论如何想要一个单一的选择。

在事件处理程序中:

var data = (sender as FrameworkElement).DataContext as MyData;

(顺便说一句,话虽如此,您是否需要选择?如果不使用 ItemsControl)

要使 ListViewItem 在单击按钮时选择自身,您可以使用 ItemContainerStyle,如下所示:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin, Mode=OneWay}" />
    </Style>
</ListView.ItemContainerStyle>

这是一个使用动画的替代方法,它在 ListView 失去焦点后保留所选项目(仅适用于 ListView.SelectionModeSingle因为似乎无法使用动画清除先前的选择):

<Style TargetType="{x:Type ListViewItem}">
    <Style.Triggers>
        <DataTrigger
                Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin, Mode=OneWay}"
                Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected">
                            <DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

关于c# - 通过按钮在 ListView 中进行单选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6255243/

相关文章:

c# - TextBox.Text 绑定(bind)到 ViewModel 的属性

c# - Segoe SemiBold 字体在 Windows Phone 应用程序中不起作用

c# - 在 PowerShell 中使用 XAML/WPF,如何填充列表框?

c# - 如何从 Entity Framework Core 的导航集合属性中获取原始值?

c# - 如何在 WPF 中保持可缩放、可滚动内容的纵横比?

c# - 类字段可以密封吗?

c# - 正确显示 BusyIndi​​cator

WPF Xaml GridView SelectionChanged 行为

c# - 如何在 Rx 中交替缓冲和流动实时数据流

c# - 为 Windows 7 及更高版本编译 C# 程序