42

私は次の(省略された)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になります。何か案は?

4

10 に答える 10

21

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

 this.DataContext = testMessage;
于 2009-10-03T03:58:43.520 に答える
16

私は今日これに出くわし、時間を無駄にし、最終的にそれを理解しました. これがあなたや他の人の時間を節約するのに役立つことを願っています.

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

public event EventHandler SomeEventHappened;

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

public event EventHandler SomeEventHappened = delegate { };

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

SomeEventHappened()

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

var eventToRaise = SomeEventHappened;
if( eventToRaise != null )
{
    SomeEventHappened()
}
于 2011-03-31T06:53:15.077 に答える
9

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

変更してみてください

OnPropertyChanged("StatusMsg");

OnPropertyChanged("statusMsg");

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

于 2009-10-03T02:38:28.250 に答える
5

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

于 2013-12-04T22:22:10.907 に答える
1

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

于 2013-10-16T18:49:59.487 に答える
1

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

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

これが機能する場所:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" ></TextBlock>
于 2015-02-15T15:01:37.637 に答える
0

PropertyChanged イベント オブジェクトが null であることが確認された場合に確認する項目がいくつかあります。

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

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

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

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

于 2010-11-15T01:20:01.957 に答える
-1

同様の問題がありましたが、上記の解決策はどちらも役に立ちませんでした。私がする必要があったのは、ビルドされた c# の Propertychanged を使用することだけでした。事前に propertyChanged を(偶然に)実装しましたが、それは何も指していませんでした。

于 2020-03-31T17:55:59.230 に答える
-3

すべての指示に従って、プロパティ名が正しいこと、新しい値が正しく割り当てられていること、ビュー モデルの 1 つのインスタンスを保証するためにシングルトンを使用していること、UI で DataContext が正常に割り当てられていることを確認します。プロパティの更新を強制するものはすべて、ビジュアル ツリーが完了した後に実行されます。つまり、ウィンドウの Loaded イベントではなく、プロパティの更新をボタンに移動します。これは、同じ問題があり、Infragistics NetAdvantage リボン ウィンドウの Loaded イベントからビュー モデル データ プロパティを更新すると、PropertyChanged イベントが常に null になることがわかったためです。

于 2011-01-26T11:15:27.543 に答える