我有一个实现 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
答案 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 ....
}