2011-09-22 6 views
0

이 실버 코드 -하지만 나는 이것이 WPF에서 동일하게 나타날 것이라고는 생각 - 나는이 간단한 수업을제 바인딩이 작동하지 않는 이유는 무엇입니까?

public Class A1 
{ 
     string str1; 

     public string Str_1 
     { 
      return str1; 
     } 
} 

public Class B1 
{ 
     A1 a1; 

     public A1 A_1 
     { 
      return a1; 
     } 
    } 

나는 B1 : A1.str1이 값이 "내 캐릭터"가 있다고 가정합니다.

이제 XAML에서 나는이

LayoutRoot.DataContext = this;  

합니다 (B1 객체는 XAML의 일부 생성자 기입 코드 (xaml.cs)이

<Grid x:Name="LayoutRoot" DataContext="B1"> 
    <StackPanel> 
     <TextBox Text="{Binding ElementName=A1, Path=Str_1, Mode=TwoWay}"/> 
    </StackPanel> 
</Grid> 

있다. cs 파일이고 B1도 null이 아니고 A1이 null이 아닙니다.)

하지만이 것은 작동하지 않습니다 ... 그리고 텍스트 상자의 텍스트가 A1 개체에있는 텍스트로 업데이트되지 않습니다.

+1

을 아직 당신이 보여줄 수있는, exacty 수행 할 작업을해야합니다 우리 XAML도? 경로로 바인딩을 살펴볼 필요가 있다고 생각하십시오. – gjvdkamp

+0

디버그에서 - A1 오브젝트가있는 B1 오브젝트를 볼 수 있고 A1의 str1은 오른쪽 문자열입니다. – Yanshof

답변

2

요소 바인딩을 사용하고 있지만 A1은 Xaml 페이지에서 명명 된 요소가 아닙니다.

당신이 그것을 데이터 컨텍스트 (클래스 뒤에 코드)의 A_1 속성의 Str_1 속성을 가리키는 것을 의미 Text={Binding Path=A_1.Str_1}

를 원한다.

속성에 세터가 없으므로 TwoWay는 의미가 없습니다.

제대로 이렇게 당신은 당신의 A_1 및 Str_1 속성에 대한 setter를 구현하고 모두 수업 A1에 & B1을에서 INotifyPropertyChanged를 구현해야 (변경하고 필요 당신의 가치를 가정)합니다.

+0

설명해 주시겠습니까? - str1에 바인딩을 만들고 싶습니다 - 그리고 xaml.cs에있는 객체는 B1의 객체 인스턴스입니다. – Yanshof

+1

당신이 이것을 썼을 때 함께 모범을 보였습니다 :) –

+0

고마워요! 이 일 ! 어떤 경우에 "ElementName"을 추가해야합니까? – Yanshof

2

당신은 Text={Binding Path=A_1.Str_1, Mode=TwoWay}라고 말할 수 있습니다.

또한 양방향 바인딩을 수행하려는 경우 INotifyPropertyChanged을 구현해야 코드에서 값을 업데이트 한 후 UI를 새로 고쳐야한다는 것을 WPF에 알릴 수 있습니다.

GJ는

1

첫째 수업 B1은에서 INotifyPropertyChanged like this를 구현해야합니다.

그럼 당신은이처럼 B1 클래스의 속성 프록시를해야한다 :

public string Str_1 
{ 
    get 
    { 
     return a1.str1; 
    } 

    set 
    { 
     a1.str1 = value; 
     this.RaisePropertyChanged("Str_1"); // INotifyPropertyChanged implementation method 
    } 
} 

를 마지막으로 업데이트하여 바인딩 :

<TextBox Text="{Binding Path=Str_1}"/> 
관련 문제