Как определить, какой элемент выбран во время нажатия кнопки внутри ListBox ItemTemplate - PullRequest
3 голосов
/ 01 августа 2011

У меня есть ItemTemplate, который содержит простую кнопку. Когда я нажимаю эту кнопку, мне нужен способ определить строку, по которой щелкнули, чтобы вытащить элемент, связанный со списком.

XAML

        <ListBox Name="DemoBox" SelectionChanged="listBox_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Height="150">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="400"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Grid Height="120" Grid.Column="0">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="60"/>
                            </Grid.RowDefinitions>
                            <TextBlock
                                    Grid.Row="0"
                                    Text="{Binding SomeObjProperty}"/>
                        </Grid>
                        <Grid Height="120" Grid.Column="1" Margin="0,-12,0,0">
                            <Button Click="ShowStuffOnMap_Click">
                                <Button.Background>
                                    <ImageBrush ImageSource="images/arrow.png"/>
                                </Button.Background>
                            </Button>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

обработчик кликов

    private void ShowStuffOnMap_Click(object sender, RoutedEventArgs e)
    {
        //sender is the button so ...
    }

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 01 августа 2011

Почему у вас есть кнопка с событием click внутри ListBox с событием SelectionChanged?Это компенсирует некоторые страшные UX, если у них разные действия!

Обычный подход - иметь ListBox с привязкой к данным, а затем использовать событие SelectionChanged для считывания выбранного элемента.

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var listBox = sender as ListBox;
    var selectedItem = listBox.SelectedItem as MyDataBoundType;

    if (selectedItem != null)
    {
        // do stuff
    }

    // if you use the ListBox for navigation, set the SelectedIndex to -1
    // listBox.SelectedIndex = -1;
}

Но если вы действительно хотите это сделать, вам нужно использовать свойство Tag.

<Button Click="ShowStuffOnMap_Click" Tag="{Binding}">

И затем в вашем обработчике событий:

private void ShowStuffOnMap_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    var selectedItem = button.Tag as MyDataBoundType;
}

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

0 голосов
/ 01 августа 2011

Лучший способ сделать это - иметь какой-то уникальный идентификатор в самом шаблоне.Например, у вас есть TextBlock - присвойте ему уникальное имя, а когда кнопка нажата, найдите на вторичной сетке TextBlock с идентификатором и прочитайте ее свойство Text.

...