2012-06-15 4 views
1

일부 조건에서 상수를 반환하는 뷰 모델의 속성이 있습니다. 이와 비슷한 구현Wpf 텍스트 상자가 뷰 모델에서 업데이트되지 않았습니다.

:

class Tmp : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public String Text 
     { 
      get { return "testing"; } 
      set 
      { 
       PropertyChanged(this,new PropertyChangedEventArgs("Text"));    } 
     } 
    } 

때문에 반환 "테스트"alwasys 속성 텍스트입니다. 응용 프로그램이 시작되면, 텍스트 상자 correclty 테스트를 말한다

<TextBox Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

:

나는 텍스트 상자 등을이 바인딩.

이제 Setter가 호출되는 텍스트 상자에 무언가를 입력하면 PropertyChanged가 호출됩니다.

이 후 (GUI 일 가능성이 있음) getter를 호출하고 "testing"값을 얻습니다.

그러나 텍스트 상자의 텍스트는 다시 테스트로 변경되지 않습니다.

그래서 "abc"를 텍스트 상자에 입력 할 수 있으며 모델에 "테스트"가 저장되어 있어도 텍스트 상자에 "abc"가 표시됩니다.

텍스트 상자의 텍스트가 각 키 입력시 "테스트"로 재설정되지 않는 이유는 무엇입니까?

+1

IIRC 빈 문자열 대신 propertychanged 이벤트를 통해 속성 이름을 전달해야합니까? –

+0

String.Empty 또는 ""는 "이 속성은 모두 유효하지 않습니다. 모두 가져 오십시오"라는 의미입니다.이 경우에는 "텍스트를 잘 가져옵니다"라는 의미입니다. – dowhilefor

+0

빈 스팅은 모든 것을 강제 업데이트해야합니다. 원래 속성 이름을 변경했습니다. " –

답변

6

왜 텍스트 상자에 텍스트가 다시 표시되어야합니까? 그것은 그가 속성을 새로운 가치로 말하는 중간에 있기 때문에 그것이 동일해야한다는 "알고있는"당신의 소스 속성에 썼습니다. 그렇지 않으면 순환 참조를 생성합니다. 당신이하는 일은 재산에서 기대되는 지침과 행동에 완전히 반대하는 것입니다.

세터를 제거하고 바인딩을 한 가지 방법으로 변경하고 상수가 변경되면 텍스트 속성을 올린 다음 텍스트 상자를 읽기 전용으로 만듭니다. setter에서 Propertychanged를 호출 할 필요는 없습니다.

당신의 초기 접근 작업을하려면, 당신은 탈옥하기 위해 필요한이 정말 인 것을, "텍스트 상자 속성을 변경하지만 들어오는 인상을 수신하지 않습니다"내가 추가 할

set 
{ 
    sUIDispatcher.BeginInvoke((Action)(() => Raise("Name"))); 
} 

상태 나쁜 생각을하고 그것을 그렇게하도록 강하게 반대하십시오.

+0

이것은 원본 문제의 단순화 된 버전이므로 일방적 인 바인딩을 할 수 없으므로 잠재적으로 텍스트 상자를 비활성화 할 수 있습니다. 리팩토링 또는 멀티 컨버터. –

+0

나는 그것이 효과가 있다고 생각하는 이유는 뭔가가 제 게터를 부르고 있기 때문입니다. 이 예제에서 텍스트 상자 외에 텍스트 상자가 "Text"속성을 읽고 있다고 생각했기 때문에 –

+0

텍스트 속성을 읽는 것처럼 말했습니다. 텍스트 상자에 입력 된 텍스트로 인해 업데이트 될 때, 다음 들어오는 인상이 텍스트 상자에 속성에 전달 된 내용과 정확히 일치 할 것으로 예상하기 때문에 사용자는 요청을 듣지 못하게합니다.내 대답을보십시오 당신이 원했던 것처럼 작동하는 코드 스 니펫을 추가했습니다. – dowhilefor

관련 문제