在WPF中捕获列表框项模板中的事件

时间:2010-04-01 21:39:37

标签: wpf events listbox

我有一个使用项目模板的列表框。在列表中的每个项目中,如模板中定义的那样,有一个按钮。当用户单击按钮时,我更改数据源中定义列表排序顺序的值。更改数据源不是问题,因为这在我的应用程序模板中运行得很好。

但是我的下一步是使用新的已排序数据源重新加载列表框。我试过从tempalte做这个,但它显然没有访问(或我无法弄清楚如何访问)父元素,所以我可以使用新排序的数据源重置.ItemSource属性。 / p>

似乎这是可能的,但解决方案是在逃避我:(

1 个答案:

答案 0 :(得分:1)

您可以使用数据绑定将Button的标记绑定到其ListBox祖先。例如:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="myDataTemplate">
            <Button Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"
                        Click="Button_Click">MyButton</Button>
        </DataTemplate>
    </Grid.Resources>

    <ListBox ItemTemplate="{StaticResource myDataTemplate}" ItemsSource="..." />
</Grid>

这是代码隐藏:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ListBox myListBox = (ListBox)((Button)sender).Tag;
        ...do something with myListBox...
    }

或者,您可以在代码中向上手动爬上Visual Tree(不需要Tag数据绑定):

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        DependencyObject search = (DependencyObject)sender;
        while (!(search is ListBox)) {
            search = VisualTreeHelper.GetParent(search);
        }
        ListBox myListBox = (ListBox)search;
        ...do something with myListBox...
    }