识别模板化ListBox中的按钮

时间:2009-02-20 12:37:10

标签: c# wpf listbox

我有一个ListBox,它有一个自定义DataTemplate,因此它可以正确显示它的内容 - 每行自定义“附件”(由三个字符串属性组成)对象。此外,每行都有一个按钮。该按钮应触发将所选附件添加到MemoryList的事件。这是DataTemplate:

    <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被点击哪一行,因为如果用户没有首先选择行,则按钮所在的行不会被设置为ListBox的SelectedItem然后按下按钮 - 老实说,谁做到了? :)

我该如何识别按下哪个按钮?任何帮助将不胜感激。谢谢!

[编辑] 感谢Chadwick的回答。效果很好。 [/编辑]

2 个答案:

答案 0 :(得分:2)

如果你真正想知道的是要知道点击了哪个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 :(得分:1)

  1. 尝试M-V-VM模式和命令绑定。如果datatemplate绑定到它自己的对象并且命令被激活,那么你就已经知道了被点击的记录。

  2. 在XAML中,您可以为按钮指定一个_Loaded事件处理程序。然后,在后面的代码中,设置_Click事件。也许制作一组代表,以便点击将调用不同的处理程序。