簡體   English   中英

PropertyChanged 事件總是 null

[英]PropertyChanged event always null

我有以下(縮寫)xaml:

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

我有一個 singleton class:

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");
        }
    }
}

在我的主要 window 構造函數中:

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

我無法讓文本塊顯示測試消息。 當我通過調試監控代碼時,PropertyChanged 始終為 null。有什么想法嗎?

謝謝傑羅姆! 一旦我設置了 DataContext,它就開始正常工作了! 為了測試目的,我將以下內容添加到主窗口構造函數中:

 this.DataContext = testMessage;

我今天遇到了這個問題,浪費了一些時間,最終弄明白了。 我希望這有助於為您和其他人節省一些時間。

如果您的事件沒有訂閱者,並且您只是將事件聲明為:

public event EventHandler SomeEventHappened;

然后預期為空引用 解決這個問題的方法是聲明如下:

public event EventHandler SomeEventHappened = delegate { };

這將確保當您調用時它不是空引用

SomeEventHappened()

我見過的另一種模式是初始化為委托 {} 而是檢查 null:

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

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

嘗試改變

OnPropertyChanged("StatusMsg");

OnPropertyChanged("statusMsg");

更新:另外 - 剛剛注意到你綁定到 StatusMsg(大寫“S”); 所以控件沒有綁定到屬性,這是它沒有更新的另一個原因!

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

在我的情況下,這使它起作用:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;    // this row fixed everything
    }
    ****
    Some code here with properties etc
    ***
}

另一點 - 要使 PropertyChanged 為 null,請確保將對象綁定到 DataContext,然后設置 Path 而不是直接將屬性分配給 UI 字段。

當我將現有數據分配給控件的數據綁定屬性時,我還看到 PropertyChanged 事件為 null:

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

這在哪里工作:

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

將 PropertyChanged 事件對象觀察為 null 時,需要檢查幾個項目。

  1. 確保在引發事件時作為參數傳入的屬性名稱實際上與您要定位的屬性名稱匹配。

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

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

因此,最好將該類實現為單例模式,以便您可以確保在運行時只有一個對象實例。

為了完成這個故事,我還發現如果綁定的屬性是static並且 PropertyChanged 事件不是 static ,它將是 null。一個簡單的解決方法是聲明另一個 static 事件,這樣你就有了如下兩個:

public event PropertyChangedEventHandler PropertyChanged;
public static event PropertyChangedEventHandler StaticPropertyChanged;

根據目標屬性是否為static調用PropertyChanged?.Invoke()StaticPropertyChanged?.Invoke()

我有一個類似的問題,上面的解決方案都沒有幫助我。 所有我需要做的是使用內置ç,#P ropertychanged。 事先我已經實現了 propertyChanged(偶然)並且它沒有指向任何東西。

如果您按照所有說明進行操作,驗證您的屬性名稱是否正確,是否正確分配了新值,您正在使用單例來保證您的視圖模型的一個實例,並且您已在 UI 中成功分配了您的 DataContext - 確保在可視化樹完成后,強制您的屬性更新的任何內容都已完成,即將您的屬性的刷新移動到按鈕,而不是說窗口的 Loaded 事件。 我這樣說是因為我遇到了同樣的問題,發現當我從 Infragistics NetAdvantage 功能區窗口的 Loaded 事件刷新我的視圖模型數據屬性時,我的 PropertyChanged 事件始終為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM