Beispiel #1
0
        /// <summary>
        /// 设置对象的动态属性值,clr属性值的设置不在这里处理。设置动态属性值之前,首先要进行各种校验。
        /// 为了在界面上体现对象的最新属性,即使属性值校验有问题,也会将错误值设置给属性。
        /// </summary>
        /// <param name="propertyName">属性名</param>
        /// <param name="value">属性值</param>
        /// <param name="isNew">新建时,即使校验错误,也要给数据</param>
        /// <param name="isDefault">设置默认值时,不发生动态属性改变事件</param>
        public void SetPropertyValue(string propertyName, object value, bool isNew, bool isDefault)
        {
            //如果类型为空,设置类型为值类型
            var r = (from p in _ctype._customProperties where p.Name == propertyName select p).FirstOrDefault();

            if (r == null)
            {
                //根据Json值设置数据类型
                AddProperty(propertyName, value.JsonGetType());
            }
            //值为空,且有默认值,取默认值
            var dValue = (from ps in PropertySetters where ps.PropertyName == propertyName && ps.Default != null select ps.Default).FirstOrDefault();

            if (value == null && dValue != null)
            {
                value = dValue;
            }
            //把Json值转换成对应类型
            value = value.JsonConvert(_ctype.GetProperty(propertyName).PropertyType);
            //校验,校验后对象的错误状态将保持
            Validate(propertyName, value);
            //不管校验是否通过,只要值确实改变了,赋值。此时对象为错误状态,由上层决定怎么做
            if (!_customPropertyValues.ContainsKey(propertyName) || !value.NewEquals(GetPropertyValue(propertyName)))
            {
                _customPropertyValues[propertyName] = value;
                //发送属性改变事件
                OnPropertyChanged(propertyName);
                if (!isDefault)
                {
                    //发送动态属性改变事件
                    OnDynamicPropertyChanged(propertyName);
                }
            }
        }