Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF中的列表框项目模板中捕获事件_Wpf_Events_Listbox - Fatal编程技术网

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

在WPF中的列表框项目模板中捕获事件,wpf,events,listbox,Wpf,Events,Listbox,我有一个使用项目模板的列表框。在模板中定义的列表中的每个项目中都有一个按钮。当用户单击按钮时,我会更改数据源中定义列表排序顺序的值。更改数据源不是问题,因为这在我的应用程序模板中运行良好 但是,我的下一步是使用新的排序数据源重新加载列表框。我尝试从tempalte执行此操作,但它显然没有访问父元素的权限(或者我不知道如何获得访问权限),因此我可以使用新排序的数据源重置.ItemSource属性 这似乎是可能的,但解决方案却让我无法理解:(您可以使用数据绑定将按钮的标记绑定到其列表框祖先。示例:

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

但是,我的下一步是使用新的排序数据源重新加载列表框。我尝试从tempalte执行此操作,但它显然没有访问父元素的权限(或者我不知道如何获得访问权限),因此我可以使用新排序的数据源重置.ItemSource属性


这似乎是可能的,但解决方案却让我无法理解:(

您可以使用数据绑定将按钮的标记绑定到其
列表框
祖先。示例:

<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>

或者,您可以在代码中手动向上爬升可视化树(不需要
标记
数据绑定):


您可以使用数据绑定将按钮的标记绑定到其
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>

或者,您可以在代码中手动向上爬升可视化树(不需要
标记
数据绑定):


为什么需要手动重新加载列表框?如果数据源具有某种通知机制(例如,如果它是
BindingList
),列表框应自动注意到其ItemSource已更改。为什么需要手动重新加载列表框?如果数据源具有某种通知机制(例如,如果它是一个
绑定列表
),则列表框应自动注意到其ItemSource已更改。
    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...
    }