我在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找到他们的内容模板,但是我不知道如何以相反的方式工作。 :/
答案 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);
答案 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);