如何访问数据绑定ContentControl生成的DataTemplate内容?

5
假设我有以下内容:
<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实例,并将其DataContext设置为Binding所在的位置,也就是ContentControl
问题是,如何访问这个生成的内容(即MainBaseView实例)?我试图将uxButtonsDataContext绑定到生成的Content中的网格,但在检查Content时,它只包含绑定,而不包含MainBaseView实例及其逻辑/可视树。

"contains the xaml" 是什么意思?您是希望将实际的标记文本作为绑定结果,还是希望获取uxMaster内容的uxGrid属性? - Patrick
抱歉,我不是指XAML...我是指包含uxGrid的元素树。换句话说,MainBaseView实例在哪里,以便我可以遍历其逻辑和视觉树并在需要时进行绑定? - Anthony
如果您提供的xaml是这样的,那么您不仅可以键入{Binding uxGrid}吗? - Patrick
1
不行。如果{Binding}绑定到MainViewModel的实例,那么{Binding uxGrid}显然不起作用。MainViewModel没有uxGrid属性,但是DataTemplate生成的MainBaseView有。 - Anthony
1个回答

4
/// <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;
}

那么你只需要调用
var baseView = uxMaster.GetChildOfType<MainBaseView>()

这当然是答案;我希望有人能够展示是否可以在纯XAML中实现(这种方法需要使用转换器)。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接