2012-03-07 4 views
1

В программировании WPF у меня возникла проблема написать обработчик события нажатия кнопки. Поскольку кнопка находится внутри элемента списка (часть таблицы данных), и когда кнопка нажата, я не могу определить, к какому элементу принадлежит. Есть ли решение? SOS - -Как идентифицировать нажатую кнопку принадлежит к элементу списка?

+0

Depends, вы защищать родовое Нажмите Handler в качестве вложенного события на ListBox? Или у вас есть обработчик события щелчка на каждом элементе ListboxItem? Во всяком случае, если объект отправителя или свойство RoutedEventArgs должно быть вашим объектом clicked. – dowhilefor

+0

Мы можем помочь вам, если вы предоставите какой-то код или объясните, как вы это делаете. –

ответ

0

ListBox.selectedItem и listbox.SelectedIndex будет установлен как часть нажатия кнопки.

Предполагая, что элементы в списке есть говорят типа MyListBoxItem

void SomeButtonClick(Object sender, EventArgs e) 
{ 
    ListBox lb = sender as ListBox 
    if (lb != null) 
    { 
    MyListBoxItem item = lb.SelectedItem As MyListBoxItem; 
    if (item != Null) 
    { 
     item.MethodRelatedToButton(); // maybe 
    } 
    } 
} 

Усиленный по запросу

+0

Извините, я не понимаю ваши слова? можете ли вы объяснить более подробно? –

+0

Он имел в виду, что Listbox, в котором был нажат один из ваших детей, также получает свойство SelectedIndex и SelectedItem из-за нажатия на дочерний элемент. Вы можете использовать эти свойства, чтобы увидеть, какой элемент был нажат. – dowhilefor

9

кажется, что вы связали поле со списком в коллекцию, и ваши кнопки являются частью вашего данных Шаблон шаблона или элемента.
Вы можете связать Tag свойство кнопки к объекту данных:

<DataTemplate DataType="{x:Type c:Person}"> 
    <StackPanel Orientation="Vertical"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock>Name:</TextBlock> 
      <TextBlock Text="{Binding Path=Name}"/> 
     </StackPanel> 
     <Button Click="Button_Click" Tag="{Binding Path=.}">Click me!</Button> 
    </StackPanel> 
</DataTemplate> 

и событие Click:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Button b = (Button)sender; 
    Person p = (Person)b.Tag; 
    MessageBox.Show(p.Name); 
} 

Но, как и другие люди полагают, вы можете использовать DataContext свойство объекта Кнопка. Он уже указывает на объект Person в моем примере.

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

Существует множество способов сделать все! Выберите тот, который вам больше всего подходит.

+0

thx для вашего объяснения и кода, и я исправил свою проблему. –

+0

Кстати, что такое свойство тега вообще? –

+0

Используется для хранения некоторых пользовательских данных в элементах управления. Все элементы управления WPF и WindowsForms обладают этим свойством. Кстати, свойство DataContext кнопки уже указывает на тот же самый объект. –

3

Вы можете получить эту информацию с DataContext.

public class Person { 

    public string Name { get; set; } 
    public int Age { get; set; } 

} 

Persons = new ObservableCollection<Person>() { 

     new Person() { Name = "John", Age = 30 }, 
     new Person() { Name = "Tim", Age = 48 } 
}; 

lbPersons.DataContext = Persons; 

private void person_Clicked(object sender, RoutedEventArgs e) { 

     Button cmd = (Button)sender; 
     if (cmd.DataContext is Person) { 
      Person p = (Person)cmd.DataContext; 
     } 
    } 

И в XAML:

<Window.Resources> 
    <DataTemplate x:Key="UserTemplate" > 
     <StackPanel Orientation="Horizontal" > 
      <TextBlock Text="{Binding Path=Name}" Width="50"/> 
      <TextBlock Text="{Binding Path=Age}" Width="20"/> 
      <Button Content="Click" Click="person_Clicked"/> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <ListBox IsSynchronizedWithCurrentItem="True" Name="lbPersons" ItemsSource="{Binding}" ItemTemplate="{StaticResource UserTemplate}" /> 
</Grid> 
Смежные вопросы