2009-07-16 90 views
4

我有一些的TextBlocks和按钮列表框 - 按钮的代码隐藏它调用传递当前选中的列表框项目的方法,这个伟大的工程。问题是,当我选择一个项目,然后点击它不更新“的SelectedItem”属性的另一项目的按钮 - 有什么办法XAML中或C#,我可以强制点击一个按钮来选择父ListBoxItem的?WPF列表框按钮来选择项目

的XAML

<DataTemplate> 
    <Grid> 
     <Button x:Name="myButton" Click="myButton_Click" Height="30" Width="30"> 
      <Image Source="Resources\Image.png" /> 
     </Button> 
     <TextBlock Text="{Binding DataField}"></TextBlock> 
    </Grid> 
</DataTemplate> 
+0

因此,有一个按钮,并为每个ListBoxItem的一个文本块?你可以发布你的XAML,或给我们一个更好的想法如何设置? – Charlie 2009-07-16 20:18:19

回答

19
var curItem = ((ListBoxItem)myListBox.ContainerFromElement((Button)sender)).Content; 
3

当点击一个按钮,将其设置e.Handled为true,导致路由事件遍历停止。

你可以一个处理程序添加到再次引发路由事件,或者发现型ListBoxItem的视觉祖先,并将其IsSelected属性为true的按钮。

编辑

扩展方法是这样的:

public static DependencyObject FindVisualAncestor(this DependencyObject wpfObject, Predicate<DependencyObject> condition) 
{ 
    while (wpfObject != null) 
    { 
     if (condition(wpfObject)) 
     { 
      return wpfObject; 
     } 

     wpfObject = VisualTreeHelper.GetParent(wpfObject); 
    } 

    return null; 
} 

用法:

myButton.FindVisualAncestor((o) => o.GetType() == typeof(ListBoxItem)) 
+0

这样的方法会是什么样子?我如何找到按钮所在的ListBoxItem的可视祖先? – Nate 2009-07-16 20:26:39

+1

编辑我的答案。 – 2009-07-16 20:36:54