0

public Event PropertyChanged を持つ抽象基本クラスがあります。別の子クラスで構成される子クラスがあり、イベントを所有者に伝達したいと考えています。しかし、イベントを接続しようとすると、何も得られません。

public abstract class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChange(string propertyName)
    {
        if (this.PropertyChanged == null) return;

        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Customer : ViewModel
{
   public Address Address
    {
        get { return _Address; }
        set
        {
            _Address = value;
            OnPropertyChanged("Address");
        }
    }
    private Address _Address = new Address();

    public Customer()
    {
        // I get nothing here. But why?
        Address.PropertyChanged += (o, e) => Logger.Log("Just do something, please!");

        // What I want to do is get Customer propertychange to fire
        // Because currently Address changes are not detected.
    }
}

public class Address : ViewModel
{
    private string _addy = "";
    public string Addy
    {
        get { return _addy; }
        set 
        {
            _addy=value;
            Logger.Log("Testing that at least something works");
            // I have verified that this is getting called, firing the event.
            OnPropertyChange("Addy");
        }
    }
}

編集:更新:

気になる方は(サーヴィさんだと思います)。問題は、アドレスがコードの別の部分でリセットされていることが判明しました。したがって、実際には、フックアップはコンストラクターで期待どおりに発生していましたが、Address が別のインスタンスに設定されたため、すぐに失われました。

返信ありがとうございます。問題の原因を絞り込むのに役立ちました(構文エラーではありませんでした) また、今後より良い質問を投稿する方法を理解するのにも役立ちました。難しい状況で質問を投稿することで、シンプルでありながらとらえどころのない答えを突き止めることができました. ありがとうございました。あなたの貢献は非常に役に立ちました。

ただし、この質問は特定の問題を示しており、コンパイル可能性に関する懸念を満たすために質問が更新され続けていると主張します (上記のコードは問題なく動作します)。コードに関しては 2 つのことがあります。1. 誰かが懸念を抱くたびに更新しました。2. 私はこのサイトを何度も利用しており、このような概念的な問題との違いを実際に見分けることができる人たちの恩恵を受けてきました。だから疑似コードを使うとこんな騒ぎになるとは知らなかった。心からお詫び申し上げます。今後はもっと気をつけます。

私の特定の問題は、イベントが発生しているにもかかわらず、イベントが接続されていない理由を理解できなかったため、この質問が特定の問題を示したと主張します。問題はServyによって狭められ(構文エラーではありません)、Wonkoによって正確に解決されました(Addressが上書きされたため、ロジックに欠陥がありました)が、スタックオーバーフローに何が適切で何が適切でないかについてもっと学ぶことにオープンです.

一部の人々にとってはそのような問題であるように思われるため、この時点でこのトピックを閉じていただければ幸いです. でも閉め方がわかりません。一部の人にとっては大したことだと気づいたので、削除しようとしましたが、コメントのあるトピックは削除できません:(

4

2 に答える 2

1

私が理解しているように、その Address がイベントを発生させるたびに、顧客クラスが OnPropertyChanged イベントを発生させたいと考えています。その場合、顧客クラスのサブスクリプションを次のように変更する必要があります。

public Customer : ViewModel
{
    public Address Address {get; set;} //this implements inpc but I don't show that here.
    public Customer()
    {
        // I get nothing here. But why?
        Address.PropertyChanged += (o, e) => OnPropertyChange(e.PropertyName);

        // What I want to do is get Customer propertychange to fire
        // Because currently Address changes are not detected.
    }
}

あなたが基本的にやっていることは、イベントの火を再生することです

于 2013-10-10T15:17:09.703 に答える