2009-12-18 22 views
4

問題是如何在靜態屬性上實現INotifyPropertyChanged,因爲您實現的事件不是靜態的,並且不能由靜態屬性調用。此外,您無法綁定到Silverlight中的靜態屬性。在WPF和Silverlight的靜態屬性中實現INotifyProperty更改

我見過這個問題彈出幾個論壇與各種解決方案,其中沒有一個是非常令人滿意的。

嗯,我想我已經找到了一個優雅的解決方案,但它很簡單,我覺得我必須錯過一些東西。

答案是,寫訪問一個靜態變量,像這樣的非靜態屬性:我已經測試過它

private static double length; 
    public double Length 
    { 
     get 
     { 
      return length; 
     } 
     set 
     { 
      length = value; 
      NotifyPropertyChanged("Length"); 
     } 
    } 

,它似乎工作得很好。我錯過了什麼嗎?

回答

10

從技術上講,你還沒有綁定到一個靜態屬性 - 你綁定到一個類的實例,它使用靜態字段作爲後備存儲。這將工作,在一定程度上,但是......

沒有與此一個根本性的問題 - 如果你有一個以上的項目綁定到這個相同的後備存儲(這似乎是你嘗試的東西,因爲你」有意將其設爲靜態),則INotifyPropertyChanged通知將只發生在當前綁定的實例上。

例如說,您有兩個UserControl並排坐在一起,它們都綁定到一個包含此代碼的ViewModel。當控件的設置此屬性,控制B就永遠不會收到通知(因爲它是一個的INotifyPropertyChanged的運行),因此會出現不同步的。

如果你真的想嘗試做這樣的事情,最好讓後備商店使用一個實現INotifyPropertyChanged的類,並通過你的ViewModel類「泡」出屬性。這樣,多個實例都將被正確通知,並且您可以處理可能發生的任何多線程/同步問題(如有必要)。

或者,你可能要考慮使用單一實例屬性(用一個實例字段),一個Singleton內。這也會給你「靜態」屬性的共享通知。

+0

謝謝你,這是很清楚:) 我不熟悉這個術語視圖模型,我的第一個谷歌帶來了有關MVVM設計模式的文章,那是什麼你在說什麼?如果是的話,我會讀更多關於它。 – Eric

+0

是的。一般來說,無論我在哪裏說ViewModel,只需輸入「您用作DataContext的類」。不過,MVVM值得了解,如果你打算做WPF或Silverlight開發。 –

+0

當你說房產泡沫時,你的意思是什麼?我試圖讓NotifyPropertyChanged影響所有實例。 – tofutim

1

權,但它不是一個真正的靜態屬性,是嗎?
它是一個使用靜態後臺字段的公共實例屬性。
實質上,你綁定到一個類的特定實例。

對不起,但我認爲你做錯了。
個人而言,如果不知道你是場景,我願意猜測靜態屬性綁定並不是真正需要的技術解決方案。
你在努力解決什麼問題?
爲什麼不通過對ViewModel的正常綁定解決更好?
做這種事情的用例是什麼?

就個人而言,這看起來像一個完美的場景,有一個ViewModel註冊到單例服務,並且一旦引發單例事件,就會更改ViewModel屬性。

0

爲什麼該屬性必須是靜態的?如果它只是一個常規的實例屬性,這不會是一個問題。

避免共享可變狀態時可能:)