您如何访问由DataTemplate生成的数据绑定ContentControl的内容?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了您如何访问由DataTemplate生成的数据绑定ContentControl的内容?相关的知识,希望对你有一定的参考价值。
假设我有以下内容:
<FrameworkElement.Resources>
<DataTemplate DataType="{x:Type viewmodel:MainViewModel}">
<view:MainBaseView />
</DataTemplate>
</FrameworkElement.Resources>
<ContentControl x:Name="uxMaster" Grid.Row="0" Content="{Binding}" />
<view:AddRemoveBaseView x:Name="uxButtons" Grid.Row="1"
DataContext="{Binding ElementName=uxMaster, Path=Content.uxGrid}" />
现在让我们说Content
绑定到MainViewModel
的新实例。通过WPF DataTemplates
的魔力,它将创建UserControl
所在的MainBaseView
ContentControl
的实例,并将其DataContext
设置为Binding
。
问题是,您如何访问此生成的内容(即MainBaseView
实例)?我试图将uxButtons的DataContext
绑定到生成的Content
内部的网格上,但是在检查Content
时,它仅包含绑定,而不包含MainBaseView
实例及其逻辑/可视树。
答案
/// <summary>
/// Get the first child of type T in the visual tree.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns>the first child of type T in the visual tree, or null if no such element exists</returns>
public static T GetChildOfType<T>(this DependencyObject source) where T : DependencyObject
{
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(source); i++)
{
var child = VisualTreeHelper.GetChild(source, i);
if (child != null && child.GetType() == typeof(T))
return child as T;
}
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(source); i++)
{
var child = VisualTreeHelper.GetChild(source, i);
var t = child.GetChildOfType<T>();
if (t != null) return t;
}
return null;
}
以上是关于您如何访问由DataTemplate生成的数据绑定ContentControl的内容?的主要内容,如果未能解决你的问题,请参考以下文章
UWP 数据绑定:如何将按钮命令设置为 DataTemplate 中的父 DataContext