Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PropertyChanged事件触发器只发生一次_C# - Fatal编程技术网

C# PropertyChanged事件触发器只发生一次

C# PropertyChanged事件触发器只发生一次,c#,C#,我有一个实现INPC的基类,名为Bindable,这是我的事件 protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { var eventHandler = this.PropertyChanged; if (eventHandler != null) { eventHandler(this, new

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

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
一切正常,但如果我的属性changedeventhandler有两个代理,则只会被解雇一次

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:更正了FirstClass的一些代码和实例化

编辑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 
可绑定的公共类:INotifyPropertyChanged/,INotifyPropertyChanging
{
#区域可绑定基
公共事件属性更改事件处理程序属性更改;
受保护的bool SetProperty(ref T storage,T value,[CallerMemberName]String propertyName=null)
{
if(object.Equals(storage,value))返回false;
储存=价值;
此.OnPropertyChanged(propertyName);
返回true;
}
受保护的OnPropertyChanged无效([CallerMemberName]字符串propertyName=null)
{
var eventHandler=this.PropertyChanged;
if(eventHandler!=null)
{
eventHandler(这是新的PropertyChangedEventArgs(propertyName));
}
}
#端区
}//Clase que实现INotifyPropertyChanged

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

如果您只是实例化一个
FirstClass
,那么您只需要启动
Delegate1
,因为没有创建
SecondClass
对象


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

问题是,当您创建并设置一个新的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 .... 
}

它不应该是
\u MyFirstClass.PropertyChanged+=Delegate2?@JleruOHeP这不重要。@JleruOHeP你没事。。现在修复。。。只是一些免费的代码我正在委派事件在我的第一个类创建之后,我的代码样本被更正了。来说明我是怎么做的。@JuanPabloGomez好的,这解决了部分问题。属性正在更改的实例是否与属于
SecondClass
的实例相同?是的,我希望在SecondClass中触发一些额外的代码“SecondClass”是一种视图模式。它有一个第一类实例。我所有的绑定都很好,但是PropertyChanged不会在SecondClass上启动抱歉,我不明白。这意味着当我订阅时它正在构建中?试着复制粘贴我的代码。分配MyFirstClass时,事件已激发。然后你去要求c#通知你,但那已经太晚了。您不会为过去的事件调用处理程序!在我的例子中,我没有立即设置MyFirstClass,我首先告诉c#通知我任何事件;对未设置为对象实例的对象的引用:(很抱歉,不要在意。这是我的错。我正在完成测试。嗯,很有趣……你能编辑你的帖子,把SetProperty的实现包括进来吗?