【发布时间】:2011-02-25 10:34:17
【问题描述】:
alt text http://www.freeimagehosting.net/uploads/abbcae9cd3.png
我想创建一个如图所示的列表框, 我只是不知道如何获得列表框中每个项目的按钮(红色关闭按钮)单击事件 谁能给我一个很好的教程
谢谢
【问题讨论】:
alt text http://www.freeimagehosting.net/uploads/abbcae9cd3.png
我想创建一个如图所示的列表框, 我只是不知道如何获得列表框中每个项目的按钮(红色关闭按钮)单击事件 谁能给我一个很好的教程
谢谢
【问题讨论】:
像往常一样使用 Click 处理程序创建一个按钮:
<Button Click="MyClickHandler">...</Button>
现在,在您的点击处理程序中,您有 sender 参数,它将包含被点击的按钮。但是,您想要按钮所属的项目。首先,您需要包含该按钮的 ListViewItem。有几个关于如何找到视觉祖先的实现,here's the first result I found. 将该扩展方法添加到某个静态类中。所以现在你的点击处理程序看起来像这样:
private void MyClickHandler(object sender, RoutedEventArgs e)
{
ListViewItem parent = ((DependencyObject)sender).TryFindParent<ListViewItem>();
}
现在您需要检索与此 ListViewItem 相关的项目。谢天谢地,这要简单得多(虽然我不知道它是什么,因为你的帖子没有说):
object ItemRelatedToButton = TheListBoxInQuestion.ItemContainerGenerator.ItemFromContainer(parent);
将object 替换为您的ListBox 实际包含的类型,并将名称替换为实际相关的名称。此时,您现在可以与按钮“附加”到的项目进行交互。
您可能还想确保parent 不为空,以防万一发生奇怪的事情,理论上您应该确保ItemRelatedToButton 也不为空。
【讨论】:
如果您不想像 MVVM 建议的那样在后面编写代码,您有两种选择: 1.如果你的数据模板中的控件支持ICommand,则将DataContext作为CommandParameter发送。然后参数将传递给您的命令执行方法。 2.如果控件没有ICommand属性,创建一个附加属性,在PropertyChangedCallback回调中,你可以hook一个命令到你的点击事件。再说一次,在 Xaml 中,您可以将 Datacontext 作为 CommandParameter 传递。
很抱歉没有详细说明,但是如果您搜索 MVVM、Command 和 Attached,您应该会找到大量详细信息。
【讨论】: