PropertyChanged事件触发器仅发生一次

时间:2014-09-10 00:14:44

标签: c#

我有一个实现 INPC 的基类,名为 Bindable 这是我的活动

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

一切正常但如果我的 PropertyChangedEventHandler 有两名代表,则只会触发一次。

public class FirstClass : Bindable
{
    public FirstClass()
    {
        PropertyChanged += Delegate1;
    } 

    Void Delegate1 .... 
}

public class SecondClass : Bindable
{

    private FirstClass _MyFirstClass
    public FirstClass MyFirstClass
    {
        get { return _MyFirstClass; }
        set { SetProperty(ref _MyFirstClass, value); }
    } 

    public SecondClass()
    {
        MyFirstClass = new FirstClass();     
        MyFirstClass.PropertyChanged += Delegate2;
    } 

    Void Delegate2 .... 
}

在这个简单的 Delegate1 中, Delegate2 永远不会发生。

如何正确实施我的方法以触发任何委托?

编辑1:更正了Firsrtclass的一些代码和实例。

编辑2:完全实施

public class Bindable : INotifyPropertyChanged //, INotifyPropertyChanging
{
    #region BindableBase
    public event PropertyChangedEventHandler PropertyChanged;

   protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
    {
        if (object.Equals(storage, value)) return false;

        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion

} //    Clase que implementa INotifyPropertyChanged 

2 个答案:

答案 0 :(得分:1)

您的代码设置错误,无法正常运行。

如果您只是实例化一个FirstClass,则只会Delegate1触发,因为没有创建SecondClass个对象。

如果您实例化SecondClass,则对FirstClass的引用为空,因此它应立即在事件注册时抛出NullReferenceException。您需要在创建FirstClass时创建SecondClass,或在其构造函数中传递SecondClass FirstClass实例,然后您可以使用该实例注册该事件。< / p>

答案 1 :(得分:1)

问题在于,当您创建FirstClass的新实例并进行设置时,事件已经触发,然后才有机会订阅它。

您可以将FirstClass构造函数的内容移动到新方法,并在绑定事件后调用该方法。

以下是您修改的代码:

public class FirstClass : Bindable
{
    public void Init()
    {
        PropertyChanged += Delegate1;
        // other stuff 
    } 

    Void Delegate1 .... 
}

public class SecondClass : Bindable
{

    private FirstClass _MyFirstClass
    public FirstClass MyFirstClass
    {
        get { return _MyFirstClass; }
        set { SetProperty(ref _MyFirstClass, value); }
    } 

    public SecondClass()
    {
        MyFirstClass = new FirstClass();     
        MyFirstClass.PropertyChanged += Delegate2;
        MyFirstClass.Init();
    } 

    Void Delegate2 .... 
}