全局 属性 已更改的对象转换结果为 null(在 C# 中)
Global Property Changed object casting results in null (in C#)
我在初始化新变量时遇到了一些问题,因为全局 属性 发送的对象发生了变化。我有两个 classes BeltConfiguration
和 BeltProperty
(两个 classes 都有 INotifyPropertyChanged
)。我在 BeltConfiguration
class 中有一个 globalpropertychanged
方法,如此处所示。
private void BeltProperty_GlobalPropertyChanged(object sender, PropertyChangedEventArgs e)
{
BeltProperty validBelt = sender as BeltProperty;
if (validBelt != null)
{
this.Validation = validBelt.Validation;
}
switch (e.PropertyName)
{
case "Value":
this.Validation.ValidState = ConfigurationValid.Unknown;
OnPropertyChanged("Validate");
break;
case "ConfigurationInvalid":
this.Validation.ValidState = ConfigurationValid.False;
OnPropertyChanged("Validate");
break;
}
}
在BeltProperty
class中,我用OnGlobalPropertyChanged("ConfigurationInvalid");
来称呼这个
但是,当我调用它时,无论我做什么,validBelt
总是导致 null
。我通过单步执行代码查看了对象发送者,它说声明方法 GenericParametersAttributes
和 GenericParametersPosition
引发了异常 System.InvalidOperationException
。我不知道这是否与 validBelt
不接受发件人为 BeltProperty
的原因有什么关系。感谢您给我的任何帮助或建议。
这是我在 Belt 属性 class.
中调用 BeltProperty_GlobalPropertyChanged 的地方
private ConfigurationValidation _Validation = new ConfigurationValidation(ConfigurationValid.Unknown, "", "", null);
/// <summary>
/// Stores information as to wether this belt property is valid or invalid, and the details.
/// </summary>
internal ConfigurationValidation Validation
{
get { return _Validation; }
set {
_Validation = value;
if(_Validation.ValidState == ConfigurationValid.False)
{
OnGlobalPropertyChanged("ConfigurationInvalid");
}
}
}
/// <summary>
/// A global on property change that runs for any instantiated object of this type.
/// </summary>
/// <param name="name"></param>
static void OnGlobalPropertyChanged(string name)
{
GlobalPropertyChanged(
typeof(BeltProperty),
new PropertyChangedEventArgs(name));
}
由于您在此处使用安全转换:
BeltProperty validBelt = sender as BeltProperty
当 validBelt
在这个赋值之后是 null
时,这意味着不能将 sender 转换为 BeltProperty
的实例。
查看您的调用代码,您似乎没有将 BeltProperty
的实例传递到您的事件处理程序中。
假设 GlobalPropertyChanged
是您的 PropertyChangedEventHandler
代表,将您的 OnGlobalPropertyChanged
代码更改为:
/// <summary>
/// A global on property change that runs for any instantiated object of this type.
/// </summary>
/// <param name="name"></param>
static void OnGlobalPropertyChanged(string name)
{
GlobalPropertyChanged(
this,
new PropertyChangedEventArgs(name)
);
}
我在初始化新变量时遇到了一些问题,因为全局 属性 发送的对象发生了变化。我有两个 classes BeltConfiguration
和 BeltProperty
(两个 classes 都有 INotifyPropertyChanged
)。我在 BeltConfiguration
class 中有一个 globalpropertychanged
方法,如此处所示。
private void BeltProperty_GlobalPropertyChanged(object sender, PropertyChangedEventArgs e)
{
BeltProperty validBelt = sender as BeltProperty;
if (validBelt != null)
{
this.Validation = validBelt.Validation;
}
switch (e.PropertyName)
{
case "Value":
this.Validation.ValidState = ConfigurationValid.Unknown;
OnPropertyChanged("Validate");
break;
case "ConfigurationInvalid":
this.Validation.ValidState = ConfigurationValid.False;
OnPropertyChanged("Validate");
break;
}
}
在BeltProperty
class中,我用OnGlobalPropertyChanged("ConfigurationInvalid");
来称呼这个
但是,当我调用它时,无论我做什么,validBelt
总是导致 null
。我通过单步执行代码查看了对象发送者,它说声明方法 GenericParametersAttributes
和 GenericParametersPosition
引发了异常 System.InvalidOperationException
。我不知道这是否与 validBelt
不接受发件人为 BeltProperty
的原因有什么关系。感谢您给我的任何帮助或建议。
这是我在 Belt 属性 class.
中调用 BeltProperty_GlobalPropertyChanged 的地方 private ConfigurationValidation _Validation = new ConfigurationValidation(ConfigurationValid.Unknown, "", "", null);
/// <summary>
/// Stores information as to wether this belt property is valid or invalid, and the details.
/// </summary>
internal ConfigurationValidation Validation
{
get { return _Validation; }
set {
_Validation = value;
if(_Validation.ValidState == ConfigurationValid.False)
{
OnGlobalPropertyChanged("ConfigurationInvalid");
}
}
}
/// <summary>
/// A global on property change that runs for any instantiated object of this type.
/// </summary>
/// <param name="name"></param>
static void OnGlobalPropertyChanged(string name)
{
GlobalPropertyChanged(
typeof(BeltProperty),
new PropertyChangedEventArgs(name));
}
由于您在此处使用安全转换:
BeltProperty validBelt = sender as BeltProperty
当 validBelt
在这个赋值之后是 null
时,这意味着不能将 sender 转换为 BeltProperty
的实例。
查看您的调用代码,您似乎没有将 BeltProperty
的实例传递到您的事件处理程序中。
假设 GlobalPropertyChanged
是您的 PropertyChangedEventHandler
代表,将您的 OnGlobalPropertyChanged
代码更改为:
/// <summary>
/// A global on property change that runs for any instantiated object of this type.
/// </summary>
/// <param name="name"></param>
static void OnGlobalPropertyChanged(string name)
{
GlobalPropertyChanged(
this,
new PropertyChangedEventArgs(name)
);
}