web-dev-qa-db-ja.com

PropertyChangedイベントは常にnull

次の(短縮)xamlがあります。

<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は常にnullです。何か案は?

35
Dave

ありがとうジェローム! DataContextを設定すると、正常に機能し始めました!テスト目的で、メインウィンドウコンストラクターに次を追加しました。

 this.DataContext = testMessage;
18
Dave

今日私はこれに出くわし、少し時間を浪費し、最終的にそれを見つけました。これがあなたや他の人たちの時間の節約に役立つことを願っています。

イベントのサブスクライバーが存在せず、単にイベントを次のように宣言した場合:

public event EventHandler SomeEventHappened;

その場合、null参照が期待されます。これを回避するには、次のように宣言します。

public event EventHandler SomeEventHappened = delegate { };

これにより、次のように呼び出すときに、null参照ではないことが保証されます。

SomeEventHappened()

私が見た別のパターンは、notデリゲート{}に初期化し、代わりにnullをチェックすることです:

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

OnPropertyChanged文字列は、大文字と小文字が区別されるため、プロパティの名前と正確に一致する必要があります。

変更してみてください

OnPropertyChanged("StatusMsg");

OnPropertyChanged("statusMsg");

更新:また-StatusMsg(大文字の 'S')にバインドしていることに気づきました。そのため、コントロールはプロパティにバインドされていませんでした。これが、更新されなかったもう1つの理由です。

9
kiwipom

念のため:同様の問題がありましたが、私の間違いはINotifyPropertyChangedを実装したクラスがプライベートであったことです。公開することで私の問題は解決しました。

4
lukaszk

コントロールのデータバインドプロパティに既存のデータが割り当てられている場合、PropertyChangedイベントがnullであることも確認しました。

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

これが機能する場所:

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

私の場合、これは機能します:

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

別のポイント-PropertyChangedをnullにするには、オブジェクトをDataContextにバインドしてから、プロパティをUIフィールドに直接割り当てるのではなく、Pathを設定してください。

1
vancutterromney

PropertyChangedイベントオブジェクトをnullとして監視する場合に確認する項目がいくつかあります。

  1. イベントを発生させるときに引数として渡されたプロパティ名が、ターゲットにしているプロパティの名前と実際に一致することを確認してください。

  2. バインドしているプロパティを含むオブジェクトのインスタンスを1つだけ使用していることを確認してください。

項目番号2の場合、これは、バインドされているプロパティを保持するオブジェクトのクラスコンストラクターにブレークポイントを配置するだけで実行できます。ブレークポイントが複数回トリガーされる場合、問題が発生し、オブジェクトのインスタンスの数を、ランタイムがXAMLを介して呼び出す1つのインスタンスのみに解決する必要があります。

したがって、そのクラスをシングルトンパターンとして実装することをお勧めします。これにより、実行時にオブジェクトのインスタンスを1つだけ確保できます。

0
Scott Nimrod