2011-02-17 5 views
1

나는 나의 CustomerView 내 childViewSilverlight : 부모 뷰의 DataContext에 바인딩하는 방법?

<UserControl ... x:Name="MyParentView"> 
    <Grid> 
     <sdk:TabControl Name="ContactTabControl"> 
      <sdk:TabItem Header="Contact" Name="CustomerTabItem"> 
       <Grid> 
        <Views:CustomerView/> 
       </Grid> 
      </sdk:TabItem> 
     </sdk:TabControl> 
    </Grid> 
</UserControl> 

이 들어 나는 부모의 DataContext에 FIRSTNAME 텍스트 상자를 결합하고 싶습니다 ParentView 있습니다. 나는 CustomerView 안에이 시도 :

<TextBox Text={Binding ElementName=MyParentView, Path=DataContext.Firstname} /> 

내가 CustomerView는 따라서 ElementName을 "MyParentView는"발견되지 않을 것이다, 모든 부모를 볼 수 없습니다 느낌이있다.

이것에 대한 귀하의 조언은 무엇입니까?

답변

4

비슷한 일을했지만 경로에 직접 바인딩하면 명시적인 데이터 컨텍스트를 제공하지 않으면 계층 구조를 조회하여 일치하는 항목을 찾습니다.

그래서 당신이 원하는 무엇을 얻어야한다 : 당신이 명시 적 데이터 컨텍스트를 지정해야하는 경우

<TextBox Text={Binding Path=FirstName} /> 

당신은 항상 수행 할 수 있습니다

<Grid> 
    <Views:CustomerView DataContext={"CustomContextHere"}/> 
</Grid> 
+0

완벽하게 작동했습니다. xaml의 마법 ... – Houman

+0

도움이 될 수있어서 기쁩니다. – Maverik

2

Maverik의에 대한 대안 솔루션입니다 :

1 고객보기에 종속성 속성을 정의하십시오.

public partial class CustomerView : UserControl 
    { 
     public CustomerView() 
     { 
      InitializeComponent(); 
     } 

     public static DependencyProperty FirstNameProperty = 
      DependencyProperty.Register("FirstName", typeof(string), typeof(CustomerView), new PropertyMetadata(string.Empty, CustomerView.FirstNameChanged)); 

     public string FirstName 
     { 
      get { return (string)GetValue(FirstNameProperty); } 
      set { SetValue(FirstNameProperty, value); } 
     } 

     private static void FirstNameChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { } 
    } 

이이 종속성 속성에 바인딩 고객 뷰의 텍스트 상자를 수정 (바인딩 요소를주의 "이")

<UserControl x:Class="SLApp.CustomerView" 
    x:Name="this" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBox Text="{Binding Path=FirstName, ElementName=this, Mode=TwoWay}"/> 
    </Grid> </UserControl> 

3 부모 뷰를 수정하고 새로운 종속성 속성

<sdk:TabControl Name="ContactTabControl"> 
         <sdk:TabItem Header="Contact" Name="CustomerTabItem"> 
          <Grid> 
           <local:CustomerView FirstName="{Binding ElementName=ContactTabControl, Path=DataContext}"/> 
          </Grid> 
         </sdk:TabItem> 
        </sdk:TabControl> 
데이터 컨텍스트의 바인드 부모의 DataContext에

public partial class MyParentView : UserControl 
    { 
     public MyParentView() 
     { 
      InitializeComponent(); 

      ContactTabControl.DataContext = "A name"; 
     } 
    } 

짜잔 '이 작동

4 세트. 가장 우아한 해결책은 아니지만 시나리오에 맞게 작업을 완료하십시오.

+0

이 예를 들어 주셔서 감사합니다. 나는 처음부터 의존성 속성을 볼 수 있기 때문에 그 가치가 있다고 생각합니다. :) MVVM이 소개 된 이래로 이것들에는 거의 사용되지 않습니다. 그러나 면접을 위해 knwo하는 것이 좋다. +1 – Houman

+0

당신은 대개 환영합니다. MVVM을지지합니다. :) – Maciek

관련 문제