2009-06-19 59 views
0

對於依賴外部來源的屬性創建DependencyProperty,我有點困惑。例如,在超聲應用程序我寫,我現在有一個託管C++包裝以下(翻譯成C#的就在這裏簡單,實現INotifyPropertyChanged的):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不使用getter或setter來訪問值所以你不能依賴於所有時間運行的額外代碼。

如果你確實需要這些屬性作爲依賴項屬性,那麼創建一個標準的依賴項屬性,它將有效地緩存你的ultrasound.GetParam(prmGain)結果並在PropertyChanged事件中調用ultrasound.SetParam(prmGain,value)不管財產如何變化。


雖然上面我所編寫的仍然是正確的,你重讀問題讓我覺得你可能誤解依賴項屬性是什麼。如果這個C++包裝器對象實際上是你的模型,那麼你想繼續使用INotifyPropertyChanged。依賴屬性設計爲由WPF控件在內部使用,以便於綁定並降低控件的內存佔用。它們不應該在數據提供者內部使用,這就是通知接口的用途。

+0

這就是我在做這件事的時候通過this.Gain(它調用ultrasound.GetParam)的時候做SetValue,並且在值被手動設置的情況下值。我認爲上述邏輯將始終保持最新的本地版本的增益。 – 2009-06-19 14:58:19