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 MainBaseViewContentControlDataContextBinding

MainBaseView質問は、この生成されたコンテンツ (インスタンス)にどのようにアクセスするのですか? DataContext生成された 内のグリッドにuxButtons をバインドしようとしてContentいますが、 を調べるContentと、バインディングのみが含まれ、MainBaseViewインスタンスとその論理/ビジュアル ツリーは含まれません。

4

1 に答える 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>()
于 2012-10-24T07:11:07.627 に答える