您如何访问由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的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DataTemplate 数据类型绑定到接口?

UWP 数据绑定:如何将按钮命令设置为 DataTemplate 中的父 DataContext

如何将 ObservableCollection 绑定到 DataTemplate 中的文本框?

MVVM模式下 DataTemplate 中控件的绑定

XAML:相同的模板,不同的绑定

从 DataTemplate 访问父 DataContext