获取由 DataTemplate 实例化的对象的父级
Get parent of object instantiated by DataTemplate
我在其 DataTemplate 中有带有 UserControl 的 ListView:
<ListView ItemSource="{Binding MyCollection}" x:Name="MyListView">
<ListView.ItemTemplate>
<DataTemplate>
<MyUserControl Loaded="OnLoaded" Content="{Binding MyProperty}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
当我试图在 MyUserControl 的代码中获取父 ListView 时(通过不同的方式):
private void OnLoaded(object sender, RoutedEventArgs e)
{
var parent1 = Parent;
var parent2 = VisualTreeHelper.GetParent(this);
var parent3 = FindName("MyListView");
var parent4 = DataContext;
}
parent1 为空,
parent2 是 ListViewItemPresenter,
parent3 也为空,
parent4 是我的 ViewModel class(MyCollection 所在的位置)。
如何获得实际的 ListView?
试试这些 VisualTreeExtensions
来自 UWPCommunityToolkit
要从 ListView.ItemTemplate
(DataTemplate
) 获取父项 ListView
,请使用 FindVisualAscendant
方法
/// <summary>
/// Find first ascendant control of a specified type.
/// </summary>
/// <typeparam name="T">Type to search for.</typeparam>
/// <param name="element">Child element.</param>
/// <returns>Ascendant control or null if not found.</returns>
public static T FindAscendant<T>(this FrameworkElement element)
where T : FrameworkElement
{
if (element.Parent == null)
{
return null;
}
if (element.Parent is T)
{
return element.Parent as T;
}
return (element.Parent as FrameworkElement).FindAscendant<T>();
}
/// <summary>
/// Find first visual ascendant control of a specified type.
/// </summary>
/// <typeparam name="T">Type to search for.</typeparam>
/// <param name="element">Child element.</param>
/// <returns>Ascendant control or null if not found.</returns>
public static T FindVisualAscendant<T>(this FrameworkElement element)
where T : FrameworkElement
{
var parent = VisualTreeHelper.GetParent(element);
if (parent == null)
{
return null;
}
if (parent is T)
{
return parent as T;
}
return (parent as FrameworkElement).FindVisualAscendant<T>();
}
我在其 DataTemplate 中有带有 UserControl 的 ListView:
<ListView ItemSource="{Binding MyCollection}" x:Name="MyListView">
<ListView.ItemTemplate>
<DataTemplate>
<MyUserControl Loaded="OnLoaded" Content="{Binding MyProperty}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
当我试图在 MyUserControl 的代码中获取父 ListView 时(通过不同的方式):
private void OnLoaded(object sender, RoutedEventArgs e)
{
var parent1 = Parent;
var parent2 = VisualTreeHelper.GetParent(this);
var parent3 = FindName("MyListView");
var parent4 = DataContext;
}
parent1 为空, parent2 是 ListViewItemPresenter, parent3 也为空, parent4 是我的 ViewModel class(MyCollection 所在的位置)。
如何获得实际的 ListView?
试试这些 VisualTreeExtensions
来自 UWPCommunityToolkit
要从 ListView.ItemTemplate
(DataTemplate
) 获取父项 ListView
,请使用 FindVisualAscendant
方法
/// <summary>
/// Find first ascendant control of a specified type.
/// </summary>
/// <typeparam name="T">Type to search for.</typeparam>
/// <param name="element">Child element.</param>
/// <returns>Ascendant control or null if not found.</returns>
public static T FindAscendant<T>(this FrameworkElement element)
where T : FrameworkElement
{
if (element.Parent == null)
{
return null;
}
if (element.Parent is T)
{
return element.Parent as T;
}
return (element.Parent as FrameworkElement).FindAscendant<T>();
}
/// <summary>
/// Find first visual ascendant control of a specified type.
/// </summary>
/// <typeparam name="T">Type to search for.</typeparam>
/// <param name="element">Child element.</param>
/// <returns>Ascendant control or null if not found.</returns>
public static T FindVisualAscendant<T>(this FrameworkElement element)
where T : FrameworkElement
{
var parent = VisualTreeHelper.GetParent(element);
if (parent == null)
{
return null;
}
if (parent is T)
{
return parent as T;
}
return (parent as FrameworkElement).FindVisualAscendant<T>();
}