我有一个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的回答。效果很好。 [/编辑]
答案 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)
尝试M-V-VM模式和命令绑定。如果datatemplate绑定到它自己的对象并且命令被激活,那么你就已经知道了被点击的记录。
在XAML中,您可以为按钮指定一个_Loaded事件处理程序。然后,在后面的代码中,设置_Click事件。也许制作一组代表,以便点击将调用不同的处理程序。