【问题标题】:want to create a listbox with a textblock and a button itemtemplate想要创建一个带有文本块和按钮项模板的列表框
【发布时间】:2011-02-25 10:34:17
【问题描述】:

alt text http://www.freeimagehosting.net/uploads/abbcae9cd3.png

我想创建一个如图所示的列表框, 我只是不知道如何获得列表框中每个项目的按钮(红色关闭按钮)单击事件 谁能给我一个很好的教程

谢谢

【问题讨论】:

    标签: wpf xaml binding listbox


    【解决方案1】:

    像往常一样使用 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 也不为空。

    【讨论】:

      【解决方案2】:

      如果您不想像 MVVM 建议的那样在后面编写代码,您有两种选择: 1.如果你的数据模板中的控件支持ICommand,则将DataContext作为CommandParameter发送。然后参数将传递给您的命令执行方法。 2.如果控件没有ICommand属性,创建一个附加属性,在PropertyChangedCallback回调中,你可以hook一个命令到你的点击事件。再说一次,在 Xaml 中,您可以将 Datacontext 作为 CommandParameter 传递。

      很抱歉没有详细说明,但是如果您搜索 MVVM、Command 和 Attached,您应该会找到大量详细信息。

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 2020-08-30
        • 2011-03-17
        • 1970-01-01
        • 2011-01-23
        • 2019-12-16
        • 2011-02-13
        • 1970-01-01
        • 2015-01-02
        相关资源
        最近更新 更多