Как узнать в Listbox, какая кнопка ListItem нажата?

#silverlight #windows-phone-7 #listbox #controltemplate #selectedindex

#silverlight #windows-phone-7 #listbox #controltemplate #выбранный индекс

Вопрос:

У меня есть Listbox:

   <ListBox x:Name="FriendsRequestList">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <StackPanel>
                            <TextBlock Text="{Binding FullName}" Foreground="#FF316DCB"/>
                            <TextBlock Text="{Binding RequestText}" />
                            <StackPanel Orientation="Horizontal">
                                <Button Name="Accept" Content="Accept" Click="Accept_Click"  Foreground="#FF28901F" Background="#FFB4D8BA"/>
                                <Button Name="Decline" Content="Decline" Click="Decline_Click"  Foreground="#FF28901F" Background="#FFB4D8BA"/>
                            </StackPanel>
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
  </Listbox>
  

И я пробую это в коде:

   private void Accept_Click(object sender, RoutedEventArgs e)
    {
        Button clickedButton = sender as Button;
        StackPanel st1 = clickedButton.Parent as StackPanel;
        StackPanel st2 = st1.Parent as StackPanel;
        StackPanel st3 = st2.Parent as StackPanel;
        object parentControl = st3.Parent;
        object obj = FriendsRequestList.Items[3];
        int index1 = FriendsRequestList.Items.IndexOf(obj);
        int index2 = FriendsRequestList.SelectedIndex; 
        int SenderId = FriendRequests.ElementAt(index).SenderID;
        UserServices.FriendRequestAccept(this, SenderId);
        UserServices.GetRequests(this);
    }
  

index2 равен -1, а ParentControl равен нулю. Почему ListItem.Выбранный индекс равен -1?
И как я могу узнать, какая кнопка ListItem нажата?

Комментарии:

1. используете ли вы выражение Blend 4?

Ответ №1:

ListBox.SelectedIndex Свойство, вероятно, равно -1, потому что Button перехватывается событие click, и оно не распространяется на ListBox . В любом случае, вам не нужен индекс, чтобы делать то, что вы пытаетесь сделать.

Допустим, вы установили ItemsSource следующим образом:

 FriendsRequestList.ItemsSource = FriendRequests;
  

Теперь, предполагая, что FriendRequests есть какая-то коллекция, содержащая FriendRequest объекты, каждый из которых содержит свойства FullName , RequestText и т.д., Измените обработчик щелчка на

 private void Accept_Click(object sender, RoutedEventArgs e)
{
  FriendRequest req = ( sender as Button ).DataContext as FriendRequest;
  int senderID = req.SenderID;
  ...
}
  

Комментарии:

1. FriendsRequestList.SelectedItem = clickedButton. DataContext; int index = FriendsRequestList.SelectedIndex; int SenderID = Запросы друзей. Элементат (индекс). SenderID;

2. @AramGevorgyan Это тоже работает, но ИМО, это неправильный способ сделать это. Я не понимаю, почему вы не можете просто получить SenderID из DataContext кнопки вместо настройки ListBox.SelectedItem и получения ListBox.SelectedIndex .

3. Извините, я вас не понимаю. Я точно установил ListBox.SelectedItem, а затем получил его SelectedIndex.

4.@AramGevorgyan Да, но вам вообще не нужно возиться со ListBox. Посмотрите на код, который я опубликовал. ( sender as Button ).DataContext совпадает с объектом, который вы извлекаете с помощью FriendRequests.ElementAt(index) . Итак, полностью забудьте о ListBox, просто приведите DataContext отправителя и получите SenderID от этого.