Определение кнопки в шаблонном ListBox - PullRequest
1 голос
/ 20 февраля 2009

У меня есть ListBox, которому назначен пользовательский шаблон DataTemplate, так что он может правильно отображать свое содержимое - пользовательский объект «Accessory» (который состоит из трех строковых свойств) для каждой строки. Кроме того, есть кнопка в каждом ряду. Эта кнопка должна вызвать событие, которое добавляет выбранный аксессуар в список памяти. Вот шаблон данных:

    <DataTemplate x:Key="AccessoryListBoxTemplate">
        <StackPanel>
             <!--Truncated-->
                    <TextBlock FontFamily="Avenir Next LT Pro" VerticalAlignment="Center" FontSize="14" Text="{Binding Path=AgilityHeader}" Margin="3,0,0,0" Grid.Column="0" />
                    <TextBlock FontFamily="Avenir Next LT Pro" VerticalAlignment="Center" FontSize="14" Text="{Binding Path=ItemNumber}" Grid.Column="1" />
                    <TextBlock FontFamily="Avenir Next LT Pro" HorizontalAlignment="Right" VerticalAlignment="Center" Text="{Binding Path=Price}" FontSize="14" Grid.Column="2" />
                    <Button x:Name="ButtonAccessoryAddToMemoryList" VerticalAlignment="Center" Click="buttonAccessoryAddToMemoryList_Click" HorizontalAlignment="Right" FontSize="14" Width="80" Grid.Column="3" Margin="0,5,0,5">Minneslista</Button>
                </Grid>
            </StackPanel>
        </StackPanel>
    </DataTemplate>

А вот ListBox:

<ListBox Grid.ColumnSpan="3" Grid.Row="1" BorderThickness="0" x:Name="ListBoxAccessories" ItemTemplate="{StaticResource AccessoryListBoxTemplate}" HorizontalContentAlignment="Stretch" ItemsSource="{Binding}" SelectedIndex="-1" IsEnabled="True" />

Проблема, с которой я столкнулся, заключается в следующем: я не могу надежно определить, по какой строке щелкнуть кнопку ButtonAccessoryAddToMemoryList, поскольку строка, в которой находится кнопка, не устанавливается в качестве SelectedItem для ListBox, если пользователь не выбирает эту строку первым а затем нажмите кнопку - и, честно говоря, кто это делает? :)

Как мне узнать, какая кнопка была нажата? Любая помощь будет принята с благодарностью. Спасибо!

[EDIT] Спасибо Чедвику за этот ответ. Работает отлично. [/ EDIT]

Ответы [ 2 ]

2 голосов
/ 20 февраля 2009

Если вы действительно хотите узнать, на каком объекте Accessory щелкнули, вы можете установить свойство Tag для кнопки:

<Button x:Name="ButtonAccessoryAddToMemoryList" Tag="{Binding}" Click="buttonAccessoryAddToMemoryList_Click" ... >Minneslista</Button>

и затем отбрасываем объект в обработчике кликов:

private void ButtonAccessoryAddToMemoryList(object sender, RoutedEventArgs e)
{
    Button b = e.Source as Button;
    Accessory a = b.Tag as Accessory;
1 голос
/ 20 февраля 2009
  1. Попробуйте шаблон M-V-VM и привязку команды. Если табличка с данными была привязана к своему собственному объекту и команда была активирована, то вы уже знали бы, что нажата запись.

  2. В XAML вы можете дать кнопке обработчик событий _Loaded. Затем в приведенном ниже коде установите событие _Click. Возможно, создайте массив делегатов, чтобы щелчки вызывали разные обработчики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...