C# PropertyChanged事件触发器只发生一次
我有一个实现INPC的基类,名为Bindable,这是我的事件C# PropertyChanged事件触发器只发生一次,c#,C#,我有一个实现INPC的基类,名为Bindable,这是我的事件 protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { var eventHandler = this.PropertyChanged; if (eventHandler != null) { eventHandler(this, new
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的实现包括进来吗?