2009-06-19 5 views
0

외부 소스에 의존하는 속성의 경우 DependencyProperty을 만드는 데 다소 혼란 스럽습니다. 예를 들어, 내가 쓰고 있어요 초음파 응용 프로그램에서, 나는 현재 (에서 INotifyPropertyChanged를 구현, 여기에 단순위한 C 번호로 변환) 관리되는 C++ 래퍼에 다음과 같습니다값이 로컬에 저장되지 않는 DependencyProperties

public int Gain 
{ 
    get { return ultrasound.GetParam(prmGain); } 
    set 
    { 
     ultrasound.SetParam(prmGain, value); 
     NotifyPropertyChanged("Gain"); 
    } 
} 

내 모든 코드가 WPF에서 사용되는, INotifyPropertyChangedDependencyProperty으로 변경하는 방법과 변경 사항의 혜택을 누릴 수있는 방법을 고려했습니다. 이 중 하나와 비슷한 약 30 개의 변수가 있으며 대부분은 화면상의 슬라이더, 텍스트 블록 또는 다른 컨트롤에 데이터 바인딩됩니다.

다음은이 개체에 DependencyProperty을 구현하기 위해 올바른 것이겠습니까?

public int Gain 
{ 
    get { return ultrasound.GetParam(prmGain); } 
    set 
    { 
     ultrasound.SetParam(prmGain, value); 
     this.SetValue(GainProperty, value); 
    } 
} 

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0)); 

this.GetValue(GainProperty)을 사용하지 않은 예는 본 적이 없습니다. 또한 값을 변경할 수있는 다른 기능이 있습니다. 이것이 올바른 변화일까요?

public void LoadSettingsFile(string fileName) 
{ 
    // Load settings... 

    // Gain will have changed after new settings are loaded. 
    this.SetValue(GainProperty, this.Gain); 
    // Used to be NotifyPropertyChanged("Gain"); 
} 

또한, 보조 노트에, 나는 대부분의 속성은 데이터 바인딩있는 경우에 성능 향상을 기대한다, 또는 오히려, 경우에 성능 손실은 어디에 많은 매개 변수 데이터 바인딩되지 않습니다?

답변

2

Get 및 Set 메서드는 this.GetValue() 및 this.SetValue()에 대한 단순한 래퍼 여야합니다.이 이유는 WPF가 getters 또는 setters를 사용하여 값에 액세스하지 않기 때문입니다 그래서 항상 실행되는 추가 코드에 의존 할 수는 없습니다.

종속성 속성이 필요하면 종속성 속성을 만들고 효과적으로 초음파를 호출합니다 .GetParam (prmGain) 결과를 호출하고 ultrasound.SetParam (prmGain, value)을 신뢰할 수있는 PropertyChanged 이벤트 내에 호출합니다 아무리 재산이 바뀌더라도.


위의 내용은 여전히 ​​정확하지만 질문을 다시 읽으면 종속성 속성을 오해 할 수도 있습니다. 이 C++ 래퍼 객체가 실제로 모델이면 INotifyPropertyChanged를 사용하고 싶습니다. 종속성 속성은 바인딩을 용이하게하고 컨트롤의 메모리 사용 공간을 줄이기 위해 WPF 컨트롤에서 내부적으로 사용하도록 디자인되었습니다. 그것들은 데이터 제공자 내에서 사용되는 것으로 가정되지 않는다. 즉, 알림 인터페이스가 사용되는 것이다.

+0

이것은 내가 this.Gain (which는 ultrasound.GetParam)을 호출 할 때 SetValue를 호출하는 이유이며 값이 수동으로 설정되는 경우 값입니다. 위의 논리는 항상 Gain의 최신 로컬 버전을 유지할 것이라고 생각했습니다. –

+0

나는 당신이 가치를 얻는 것이 좋다고 생각합니다. 내 관심사는 설정입니다. 값이 WPF 바인딩을 통해 설정되면 Set을 호출하지 않습니다. 따라서 ultrasound.SetParam (prmGain, value); 호출되지 않고 초음파 객체의 값이 업데이트되지 않습니다. 바인딩은 get 또는 set을 호출하지 않고 종속성 속성 자체에서 직접 작동합니다. –

+0

당신은 아마 내가 너무 많이 생각하고 있다고 생각합니다. 나는 그것을 INotifyPropertyChanged로 유지해야합니다. DepotencyProperties가 속도를 높일 수 있다고 생각 했으므로 WPF에 데이터 바인딩을위한 기능으로 구현 된 INotifyPropertyChanged 만 있습니다. 그러나 로컬 변수가 아니라는 사실로 인해 데이터가 동기화되지 않아 복잡해졌습니다. –

관련 문제