2011-01-18 8 views
1

이것이 내 시나리오입니다. 표준 int 속성을 가진 내부 클래스가 있습니다.WPF에서 데이터 바인딩에 대한 속성 노출

public class Session : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 

    private ushort _Level; 
    public ushort Level 
    { 
     get { return _Level; } 
    } 

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

    // a timer code here updates the _Level property every 60 seconds 
    // and calls OnPropertyChange("Level"); 
} 

내 UI 창에서 세션 인스턴스에 바인딩하고 레벨 값을 표시하는 레이블이 있습니다. 당신이 추측 수있는, 내가 _level의 값을 업데이트 할 때 UI가 된 본체를 업데이트하지 않습니다, 그러나

public MyWindow() 
    { 
     SessionInstance = new Session(); 

     this.InitializeComponent(); 
    } 

    public Session SessionInstance { get; set; } 

:

<TextBlock Name="LevelTextBlock" Text="{Binding SessionInstance.Level, StringFormat='0%'}" /> 

그리고 윈도우 생성자는이 코드를 가지고있다. Session 클래스 내에 DependancyProperty를 추가하는 것은 용납되지 않습니다. 창에서이 작업을 수행 할 수는 있지만 값을 Session 인스턴스로 다시 확인하는 알리미가 필요합니다. 이 작업을 수행하는 우아한 방법이 있는지 궁금합니다. 나는 아무것도 생각할 수 없다. 텍스트 블럭 값을 검사하고 새로 고치는 창에서 다른 타이머를 실행하는 것. 의견이 있으십니까?

답변

4

INotifyPropertyChanged을 구현하십시오. tool도 모든 속성에 대해 자동으로 수행 할 수 있습니다 (또는 속성으로 표시된 항목 만, 상당히 구성 가능합니다).

다른 기능 (값 상속, 속성에서 바인딩 등)이 필요없는 경우 DependencyProperty는 과도합니다. 이는 모델 속성이 아닌 컨트롤 속성에 가장 적합합니다.

는 편집 :

private string familyName; 
public string FamilyName 
{ 
    get { return familyName; } 
    set 
    { 
     if (value != familyName) 
     { 
      familyName = value; 
      OnPropertyChanged("FamilyName"); 
     } 
    } 
} 
+0

이 내용을 추가했지만 아직 업데이트되지 않았습니다. 편집을 표시하기 위해 원본 코드를 편집합니다. –

+0

레벨 설정 기에서 OnPropertyChanged를 수동으로 호출하거나 내가 작성한 NotifyPropertyWeaver를 사용해야합니다. 올바르게 실행되었는지 확인하십시오. 빌드 출력 로그에 몇 줄을 추가합니다. –

+0

데이터 컨텍스트를 설정할 위치가 표시되지 않습니다. 창에 데이터 컨텍스트를 설정해야합니다. this.DataContext = this; –

0

당신이 속성 setter에서 OnPropertyChanged를 호출 :

올바르게은 다음과 같습니다 구현? 이것은 정말로 그것이 속한 곳입니다.

+0

이것은 적절할 수 있지만 이벤트는 어디서나 호출 할 수 있습니다. –

관련 문제