我有一个使用项目模板的列表框。在列表中的每个项目中,如模板中定义的那样,有一个按钮。当用户单击按钮时,我更改数据源中定义列表排序顺序的值。更改数据源不是问题,因为这在我的应用程序模板中运行得很好。
但是我的下一步是使用新的已排序数据源重新加载列表框。我试过从tempalte做这个,但它显然没有访问(或我无法弄清楚如何访问)父元素,所以我可以使用新排序的数据源重置.ItemSource属性。 / p>
似乎这是可能的,但解决方案是在逃避我:(
答案 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...
}