2009-10-03 48 views
33

我有以下的(略)XAML:PropertyChanged事件總是空

<TextBlock Text="{Binding Path=statusMsg, UpdateSourceTrigger=PropertyChanged}"/> 

我有一個單例類:

public class StatusMessage : INotifyPropertyChanged 
{ 
    private static StatusMessage instance = new StatusMessage(); 

    private StatusMessage() { } 

    public static StatusMessage GetInstance() 
    { 
     return instance; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string status) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(status)); 
     } 
    } 

    private string statusMessage; 
    public string statusMsg 
    { 
     get 
     { 
      return statusMessage; 
     } 
     set 
     { 
      statusMessage = value; 
      OnPropertyChanged("statusMsg"); 
     } 
    } 
} 

在我的主窗口的構造函數:

StatusMessage testMessage = StatusMessage.GetInstance(); 
testMessage.statusMsg = "This is a test msg";  

我無法使文本塊顯示測試消息。當我通過調試監視代碼時,PropertyChanged始終爲空。有任何想法嗎?

+19

你在哪裏設置你的DataContext與一個StatusMessage實例? – 2009-10-03 03:43:58

回答

9

您的OnPropertyChanged字符串必須與該屬性的名稱完全匹配,因爲它區分大小寫。

嘗試改變

OnPropertyChanged("StatusMsg"); 

OnPropertyChanged("statusMsg"); 

更新:也 - 只注意到你結合StatusMsg(大寫 'S');所以控制權不受財產約束,這是它不更新的另一個原因!

+0

我按照你所建議的Ian做了2個改變,PropertyChanged仍然評估爲NULL。有點奇怪,我知道這應該工作!我編輯了代碼以反映更改。 – Dave 2009-10-03 03:36:48

+2

@IanR我不認爲這將是空的,因爲這樣, 它只是不會更新屬性 他說,它甚至沒有機會更新,因爲它是空的 – 2012-02-28 16:00:53

17

謝謝傑羅姆!一旦我設置DataContext它就開始工作,因爲它應該!添加以下到主窗口的構造函數用於測試目的:

this.DataContext = testMessage; 
0

有幾個項目的檢查觀察PropertyChanged事件對象爲空時。

  1. 確保在引發事件時將作爲參數傳入的屬性名稱實際上與您的目標屬性的名稱匹配。

  2. 確保您只使用包含您綁定屬性的對象的一個​​實例。

對於第二個項目,這可以通過簡單地在包含被綁定屬性的對象的類構造函數中放置一個斷點來完成。 如果斷點被觸發多次,那麼您遇到了問題,需要將對象的實例數量僅解析爲運行時通過XAML調用的一個實例。

因此,最好將該類實現爲單例模式,以便在短時間內確保只有一個對象實例。

+3

什麼,Singleton?什麼?!永遠不要在我的生活中讀到如此多的垃圾。綁定系統將訂閱正確的實例事件。如果不是WPF就不行。查閱任何初學者MVVM文章,以獲得最佳實踐演示,展示您的錯誤。 – Gusdor 2011-02-02 16:35:24

+0

這是從我自己的經驗中解決問題。我在運行時有多個視圖模型的實例。因此,這個更新對我有用。感謝您的輸入。 – 2011-02-16 14:30:20

+0

另外,確保所有數據都已加載(即加載事件)。 – 2011-03-10 12:39:50

-2

如果您按照所有說明驗證您的屬性名稱是否正確,是否正確指定了新值,那麼您將使用單例保證您查看模型的一個實例,並且您已成功將DataContext分配給用戶界面 - 確保強制屬性更新的任何內容都在可視樹完成後完成,即將屬性刷新移動到按鈕上,而不是說出窗口的Loaded事件。我這樣說是因爲我有同樣的問題,並發現當我從Infragistics NetAdvantage功能區窗口的Loaded事件刷新我的視圖模型數據屬性時,我的PropertyChanged事件始終爲空。

+0

這個答案有可怕的語法,不提供結構化的答案。您提議從視圖加載監視這個人,這很複雜,並且可能會讓他們更加混淆。如果這實際上是解決null Prop事件處理程序問題的方法,那麼您應該提供方法學不是您做這件事的一個例子。 – 2017-10-11 13:42:29

14

我今天遇到了這個,並浪費了一些時間,最終找到了答案。我希望這能幫助你和他人節省一些時間。

如果沒有用戶到您的事件,您只需宣佈事件:

public event EventHandler SomeEventHappened; 

然後空引用預計。解決這個問題的方法是聲明如下:

public event EventHandler SomeEventHappened = delegate { }; 

這將確保它不是空引用,當你調用作爲

SomeEventHappened() 

我已經看到了另一種模式是初始化委託{},而是檢查空:

var eventToRaise = SomeEventHappened; 
if(eventToRaise != null) 
{ 
    SomeEventHappened() 
} 
+1

設置'this.DataContext = testMessage;'使其工作的原因是根據我的答案,可以有效地建立一個訂閱您想要觸發的事件,因此它不再爲空。 – danielpops 2011-03-31 17:52:31

+1

我相信「檢查無效」方法現在是首選方法。 我曾嘗試初始化事件處理程序,就像您在第一種情況下所做的那樣,並且該事件不再爲空,但INotifyPropertyChanged事件未觸發我正在使用的列表的更新。解決的辦法是使用INotifyCollectionChanged(請參閱:https://stackoverflow.com/questions/37329991/propertychanged-event-handler-always-null-in-win-phone-8-application獲得有關此問題的經驗)。 – rfreytag 2016-05-24 14:18:37

0

還有一點 - 爲的PropertyChanged爲空確保你的對象綁定到DataContext和T母雞設置路徑,而不是直接分配屬性到UI字段。

3

以防萬一: 我有一個類似的問題,但我的錯誤是實現INotifyPropertyChanged的類是私人的。公開解決我的案子。

1

我也看到了PropertyChanged事件爲空時,我已經分配給該控件的數據綁定的屬性現有數據:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" >Bad Text!</TextBlock> 

凡爲這個工程:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" ></TextBlock> 
相關問題