2014-02-28 2 views
1

2 개의 "텍스트 상자"가 모두 "mode = 2way"인 소스 문자열 속성에 바인딩되었습니다. 하나의 텍스트를 변경하면 다른 하나는 완벽하게 변경됩니다. 하지만 소스 문자열을 프로그래밍 방식으로 변경하면 둘 다 업데이트되지 않습니다. 나는 실종 된 것을 파악할 수 없다.소스가 프로그래밍 방식으로 변경되었을 때 바운드 대상 컨트롤이 업데이트되지 않음

XAML 코드 :

<StackPanel Orientation="Vertical"> 
    <StackPanel.DataContext> 
     <local:x/> 
    </StackPanel.DataContext> 
    <TextBox Text="{Binding Text,Mode=TwoWay}" /> 
    <TextBox Text="{Binding Text, Mode=TwoWay}"/> 
</StackPanel> 
<Button Content="Reset" Click="Button_Click"/> 

버튼을 클릭 핸들러 :

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    obj = new x() { Text="reset success"}; 
} 

개체 클래스 : 수단 위

class x:INotifyPropertyChanged 
{ 
    private string text; 
    public string Text 
    { 
     get { return text; } 
     set 
     { 
      text = value; 
      OnPropertyChange("Text"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChange(string propertyName) 
    { 
     PropertyChangedEventHandler propertyChangedEvent = PropertyChanged; 
     if (propertyChangedEvent != null) 
     { 
      propertyChangedEvent(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

코드에서 스택 패널의 datacontext를 설정하여 해결 방법을 찾았습니다. – Sidney

+0

답변을 확인하거나 도움을 더 요청하십시오 – Krekkon

답변

1

새 개체를 만들었습니다. 그것이 이유입니다. 새로운 객체를 그냥 던져서 만들지 말고 실제 바인딩 된 객체의 내용 (텍스트)을 변경하십시오.

새 개체를 만들 때 "subcription"은 솔루션에서 손실됩니다. :

1
<StackPanel x:Name="myStackPanel" Orientation="Vertical"> 
    <StackPanel.DataContext> 
     <local:x/> 
    </StackPanel.DataContext> 
    <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
    <TextBox Text="{Binding Text, Mode=TwoWay}"/> 
</StackPanel> 

XAML 발췌 : 세트 여기 내 코드 조각입니다 DataContext st ackpanel을 클래스 x의 새 인스턴스로 바꿉니다. 인스턴스화가 XAML에 의해 수행되었으므로 스택 패널의 DataContext에서 가져올 때까지 해당 x 인스턴스에 대한 참조가 없습니다.

데이터 바인딩이 작동하는지 여부를 테스트하려면 x 클래스의 기존 인스턴스 (현재 DataContext으로 설정 됨)를 수정해야합니다.

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var currentDataContext = (x)myStackPanel.DataContext; 
    x.Text = "reset success"; 
} 

당신이 코멘트에 명시된 바와 같이 코드에서 StackPanelDataContext을 설정하려면

, 그것은 XAML에 DataContext 설정 부분을 제거하는 저장됩니다.

+0

아직 동작을 이해하지 못했습니다. 첫 바인딩에 무엇이든 입력 한 것으로 작동합니다. 텍스트 상자가 두 번째에 나타나지만 버튼을 사용하여 둘 다 재설정하면 아무것도 발생하지 않습니다. – Sidney

+0

예, 바인딩이 작동하며 두 텍스트 상자가 모두 같은'x' 인스턴스에 바인딩됩니다. 그러나 버튼을 클릭하면 이미 바인딩 된 텍스트 상자가 아닌'x' 클래스의 새로운 인스턴스. – har07

관련 문제