单击列表框项中的特定元素查找ListBox

时间:2014-07-11 08:47:41

标签: wpf listbox

我在Listbox中为ListBoxItem创建了一个控件模板,每个ListBoxItem由contentpresenter和一个Image组成。

我的问题是......我怎样才能找到我在listBox项目中单击我的图像时单击的列表框。

<Style x:Key="ListBoxItemWithDelete" TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Border Name="Border" Padding="2" SnapsToDevicePixels="true">
                            <Grid>
                                <ContentPresenter VerticalAlignment="Center" />
                                <Image Name="ImageListItemDelete" Source="../Resources/Images/actions-delete-big-1.png" Width="20" Style="{StaticResource MenuItemIcon}" HorizontalAlignment="Right"
                               MouseLeftButtonUp="ImageListItemDelete_MouseLeftButtonUp"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

private void ImageListItemDelete_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
  //Object sender is my Image i Clicked.
  if (ListBoxName.SelectedItem != null)
  {
    ListBoxName.Items.Remove(ListBoxName.SelectedItem);
  }
}

我想将ListBoxName替换为包含此图像的列表框,我现在点击了#34; ListBoxName&#34;是硬编码的。

我知道如何通过listboxitems找到他们的内容模板,但是我不知道如何以相反的方式工作。 :/

2 个答案:

答案 0 :(得分:0)

你有一个答案,但由于模板差异可能并非总是如此,因此通过Visual Tree或Logical树查找是合适的

例如

public static T FindAncestor<T>(DependencyObject dependencyObject) where T : class
{
    DependencyObject target = dependencyObject;
    do
    {
        target = VisualTreeHelper.GetParent(target);
    }
    while (target != null && !(target is T));
    return target as T;
}

使用

ListBox listBox = FindAncestor<ListBox>(sender as DependencyObject);

这里更复杂的例子Finding an ancestor of a WPF dependency object

答案 1 :(得分:0)

查找特定类型UIElement的祖先的更好方法是使用VisualTreeHelper class。从链接页面:

  

提供实用程序方法,执行涉及可视树中节点的常见任务。

您可以使用此辅助方法查找ListBox

public T GetParentOfType<T>(DependencyObject element) where T : DependencyObject
{
    Type type = typeof(T);
    if (element == null) return null;
    DependencyObject parent = VisualTreeHelper.GetParent(element);
    if (parent == null && ((FrameworkElement)element).Parent is DependencyObject) 
        parent = ((FrameworkElement)element).Parent;
    if (parent == null) return null;
    else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) 
        return parent as T;
    return GetParentOfType<T>(parent);
}

您可以这样使用它:

ListBox listBox = GetParentOfType<ListBox>(sender as UIElement);