在WPF中的列表框项目模板中捕获事件
我有一个使用项目模板的列表框。在模板中定义的列表中的每个项目中都有一个按钮。当用户单击按钮时,我会更改数据源中定义列表排序顺序的值。更改数据源不是问题,因为这在我的应用程序模板中运行良好 但是,我的下一步是使用新的排序数据源重新加载列表框。我尝试从tempalte执行此操作,但它显然没有访问父元素的权限(或者我不知道如何获得访问权限),因此我可以使用新排序的数据源重置.ItemSource属性在WPF中的列表框项目模板中捕获事件,wpf,events,listbox,Wpf,Events,Listbox,我有一个使用项目模板的列表框。在模板中定义的列表中的每个项目中都有一个按钮。当用户单击按钮时,我会更改数据源中定义列表排序顺序的值。更改数据源不是问题,因为这在我的应用程序模板中运行良好 但是,我的下一步是使用新的排序数据源重新加载列表框。我尝试从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...
}