2012-10-23 2 views
3

의 다음 I가 있다고 가정 해 봅시다 :DataBound ContentControl의 DataTemplate 생성 내용에 어떻게 액세스합니까?

<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}" /> 

이제 내용의이 MainViewModel의 새로운 인스턴스에 바인딩 가정 해 봅시다. WPF DataTemplates의 마법을 통해 ContentControl이있는 UserControl MainBaseView의 인스턴스를 만들고 DataContext를 Binding으로 설정합니다.

질문 :이 생성 된 콘텐츠 (예 : MainBaseView 인스턴스)에 어떻게 액세스합니까? 생성 된 내용 안에있는 그리드에 uxButtons의 DataContext를 바인딩하려하지만 Content를 검사 할 때 MainBaseView 인스턴스와 논리/시각 트리가 아닌 바인딩 만 포함합니다. 당신은 단순히

var baseView = uxMaster.GetChildOfType<MainBaseView>() 
+0

는 "이 XAML을 포함"으로 무엇을 의미합니까 – Patrick

+0

죄송합니다. xaml을 의미하지는 않았습니다 ... uxGrid가 포함 된 요소 트리를 의미했습니다. 다시 말해, MainBaseView 인스턴스가 어디에 있는지 논리적이고 시각적 인 트리를 걸고 원하는 경우 바인딩 할 수 있습니까? – Anthony

+0

xaml이 당신이 제공 한 것과 같다면'{Binding uxGrid}'를 입력 할 수 없었습니까? – Patrick

답변

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

전화? 바인딩 결과로 실제 마크 업 텍스트를 원합니까, 아니면 uxMaster의 내용에 대해`uxGrid` 속성을 원합니까?
+0

물론 답입니다. 나는 누군가가 또한 그것이 순수한 xaml에서 가능한지를 보여주기를 희망했다. (이 방법은 변환기를 사용해야했다.) – Anthony

관련 문제