Один выбор в просмотре списка кнопкой - PullRequest
1 голос
/ 06 июня 2011

Цель:
Необходимо сделать выборку для отдельной строки, включенной в список.

Проблема:
Не знаете, как сделать один выбор в просмотре списка, когда вы нажимаете на кнопку, расположенную внутри просмотра списка.В простом объяснении, при нажатии на кнопку, выбор не будет применен в строке списка

Было бы здорово, если выбор применяется до ввода метода кнопки, потому что мне нужно получить информацию из единственноговыбор списка для отправки в бизнес-логику.


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

    }

}

1 Ответ

4 голосов
/ 06 июня 2011

Вам не нужно выбирать ListViewItem, вы можете получить ваш объект данных из DataContext из Button, и вам не нужны данные из других строк, так как вы все равно хотели один выбор.

В обработчике событий:

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.SelectionMode, равном Single, поскольку кажется невозможным очистить предыдущий выбор с помощью анимации):

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...