2011-06-11 3 views
3

WPF에서 바인딩이 작동하는 방법에 대한 질문이 있습니다.WPF에서 바인딩 질문 - 속성과 필드 간의 차이점

이 같은 속성을 가진 뷰 모델이있는 경우 : 그것은 작동

<TextBlock 
    Text="{Binding Path=TestString, Mode=TwoWay}" 
    Foreground="Red" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    FontFamily="Calibri" 
    FontSize="24" 
    FontWeight="Bold"> 
</TextBlock> 

... 여기 새로 바뀐 내용이 없음 :이 같은으로 XAML에 바인딩 경우

private string testString; 
public string TestString 
{ 
    get { return testString; } 
    set { testString = value; } 
} 

을 . 제가 테스트 문자열에서 getter 및 setter를 제거하고이 같은 끝낼 경우

그러나 :

public string TestString; 

는 바인딩 똑같은 작동하지 않습니다. 나에게 이것이 왜 발생하는지 전혀 알지 못한다. 왜냐하면 나에게 그것은 커스텀 get과 set을 가진 public 속성에 대한 public 속성과 동등하다.

누군가 나를 위해이 주제에 대해 밝힐 수 있습니까? :)

미리 TYVM!

추신 : 내 구문 강조해 죄송합니다. 코드 블록으로 작업하는 방법을 파악할 수 없습니다.

답변

2

@Silva을 통해 이동합니다. 나는 단지이 명확하게 해결 한 블로그 게시물에서 나는 피트 브라운 (Microsoft 개발자 전도사)에 건너 한 본 적이 블로그 :

http://10rem.net/blog/2010/12/17/puff-the-magic-poco-binding-and-inotifypropertychanged-in-wpf

체크 아웃 그가 PropertyDescriptor 클래스에 대해 기록하는 위치에 절을 참조하십시오. 그는 또한 다음과 같이 뷰 모델 클래스에 INotifyPropertyChanged 인터페이스를 구현하는보다 전통적인 방법을 사용하는 것에 비해 상대적으로 비효율적이라고 언급에 간다 :

private string testString; 

public string TestString 
{ 
    get { return testString; } 
    set { 
     if (testString != value) { 
      testString = value; 
      RaisePropertyChanged("TestString"); 
     } 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

private void RaisePropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

나는 4 배의 성능 저하가 있음을 읽을 꽤 놀랐습니다 인터페이스를 구현하지 않음으로써

3

getter 및 setter를 제거하면 TestString 구성원이 속성이되는 것으로 변경됩니다. 이것이 바인딩이 작동을 멈추게하고 아마도 당신이 원했던 것이 아니기 때문입니다 (일반적으로 그런 공개 필드는 나쁜 디자인으로 간주됩니다).

당신은 컴파일러는 다음과 같이 빈 게터/세터를 선언함으로써 백업 필드를 자동으로 생성 할 수 있습니다 :

public string TestString { get; set; } 
+0

당신이 말한 것은 사실입니다.그리고 나는 그 일을 끝내었지만, 그 전에는 무슨 일이 일어나고 있는지 이해하려고 벽에 머리를 때리는 데 몇 시간을 잃었습니다. 필자는 getter/setter의 존재 여부가 필드에서 속성으로 변경되는 이유를 알지 못했습니다. 나는 그것이 컴파일 시간에 컴파일러가하는 것이라고 생각한다. 주목 해 주셔서 감사합니다! – Silva

+1

@ Silva 필드 대신 구문을 사용하기 때문에이 작업이 수행됩니다. C# 언어는 속성 선언과 필드 선언을 구별하는 것과 같이 구성됩니다. –

+1

@ Silva : 장래에 "벽에 머리를 때리는 데 시간을 보내는 것"대신 출력 창을 사용하여 바인딩 오류를 디버깅하십시오. 또한 빠른 google 검색을 통해 [이 기사] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) –

2

을 내가 가져 제거한 후 수 있습니다, 그것은에서 INotifyPropertyChanged와 함께 뭔가를 가지고있을 수 있습니다 확실하지 않다 WPF가 소스가 변경되었는지 여부를 식별 할 수는 없습니다. 또는 읽기 전용 속성으로 처리되었습니다.

요청 당신이 뒤에서가는 일이, 당신의 직감이 정확이 기사

http://msdn.microsoft.com/en-us/library/ms752347.aspx

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx