2010-04-01 73 views
1

我已经有了使用项目模板的列表框。在列表中的每个项目中,按照模板中的定义,有一个按钮。当用户单击按钮时,我更改数据源中定义列表排序顺序的值。更改数据源不是问题,因为这在我的应用程序模板中工作得很好。在WPF列表框项目模板中捕获事件

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

看起来这是可能的,但解决方案是躲避我:(

+0

为什么你需要手动重新加载ListBox?如果你的数据源有某种通知机制(例如,如果它是一个'BindingList'),ListBox应该自动注意到它的ItemSource已经改变了。 – Heinzi 2010-04-01 22:02:18

回答

1

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

或者,您可以手动CL在你的代码中向上看im树(不需要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... 
    }