2016-08-11 43 views
0

所以我有一些問題讓我的Depency屬性工作。但事實上,只有當我試圖從不同的班級訪問他們時。依賴屬性GetValue在不同的類

比如我做一個檢查來ping服務器和定義相應的依賴項屬性:

 public static DependencyProperty PingStateProperty = 
     DependencyProperty.Register("PingState", typeof(bool), 
     typeof(MainWindow)); 

    public bool PingState 
    { 
     get { return (bool)GetValue(PingStateProperty); } 
     set 
     { 
      SetValue(PingStateProperty, value); 
      PropertyChanged(this, new PropertyChangedEventArgs("PingState")); 
     } 
    } 

現在我想獲得在不同的類從依賴項屬性的值(具體用戶控制)。所以我有另一個類,我試圖得到這樣的價值:

public void MethodInClass2() 
    { 
     bool ping = (bool)GetValue(MainWindow.PingStateProperty); 

我在做什麼錯在這裏?錯誤的是:當我在同一個類中調用GetValue時,它正在工作。它不會給我一個編譯錯誤或類似的東西,它似乎只是沒有傳遞正確的值(在定義了DP的類1中,我可以檢查該值並按預期​​得到「true」,但在嘗試在第二課中做同樣的事情我每次都會變得「虛假」)。

在這種情況下,我需要附加屬性嗎?與他們也試了一下,但不幸的是無濟於事。

問候

+0

你得到了錯誤的實例的值。 – SLaks

回答

0

如果您需要該屬性的值,則需要包含該值的實例,如前面的評論和答案中所述。使用setter/singleton或任何適合你的方法獲取實例。依賴/附加屬性不會解決您的問題。 (如果你想綁定到屬性,請使用依賴項屬性。)

+0

這實際上真的讓我受益匪淺。事情是,我不需要將它綁定在那裏,我只需要在用戶控制中進一步分析的價值。將發表一個答案,我已經做到了。謝謝並標記爲答案(儘管現在標題可能有點誤導......)。 – CuttingWide

0

除非您之前設置過,否則無法獲取該值。如果目標對象是相同類型或衍生的目標對象,則只能設置該值,除非它是附加屬性。調用GetValue像這樣不是從主窗口獲取屬性,它從當前實例(用戶控件)獲取屬性。

從不將額外的代碼放在CLR包裝中(public bool PingState)。它不會被綁定系統或其他正確訪問屬性時調用。要獲得更改回叫的財產,請使用metadata,電話號碼property registration

+0

好的,謝謝你的回答。提到CLR包裝問題當然是正確的,那麼我會改變這一點。但是關於實際的事情:我明白了,那麼我需要一個附加屬性。但是我能找到的通常的教程是從同一個線程那裏做的。如何從dfiferent(我的用戶控件)調用它? – CuttingWide

+0

@CuttingWide從這裏開始閱讀:[附加屬性概述](https://msdn.microsoft.com/en-us/library/ms749011(v = vs.110).aspx)。 – Clemens

+0

@CuttingWide:如果你的UserControl實際上在另一個線程上,你可能做錯了,它會使一切變得複雜。正如你接受另一個答案,我假設你只是指在這裏從另一個班的訪問。 –

-1

感謝@aQsu我能夠以不同的方式對它進行排序。我現在使用一個Singleton來獲得實例如下所示:

 private static MainWindow _instance; 

    public static MainWindow Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new MainWindow(); 

      return _instance; 
     } 
    } 

然後簡單地調用在用戶控件

  bool ping = MainWindow.Instance.PingState; 
+1

我會建議不要讓主窗口成爲單身人士。已經有一個顯着的單例,也就是'Application',所以我通常將'App'類的實例屬性定義爲'Application.Current'(需要強制轉換),所以我通常會覆蓋'Current'包含在'App'類中,因此'App.Current'返回一個'App'實例。) –

+1

應用程序還有一個'MainWindow'屬性(與'ShutdownMode'相關),你可以設置到您的實例,儘管您可能也想要使用正確類型的實例隱藏該屬性。 –