全局 属性 已更改的对象转换结果为 null(在 C# 中)

Global Property Changed object casting results in null (in C#)

我在初始化新变量时遇到了一些问题,因为全局 属性 发送的对象发生了变化。我有两个 classes BeltConfigurationBeltProperty(两个 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;
            }
        }

BeltPropertyclass中,我用OnGlobalPropertyChanged("ConfigurationInvalid");来称呼这个 但是,当我调用它时,无论我做什么,validBelt 总是导致 null。我通过单步执行代码查看了对象发送者,它说声明方法 GenericParametersAttributesGenericParametersPosition 引发了异常 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)
    );
}