代码之家  ›  专栏  ›  技术社区  ›  Wobbles

自定义类型不隐式转换为用于绑定的字符串

c#
  •  0
  • Wobbles  · 技术社区  · 7 年前

    我创建了一个自定义类型,基本上是一个字符串,但是当绑定到wp if时,会给出一个转换异常。

    public class SelectedProfileName: IConvertible
    {
        private string _value;
        public string Value { get { return _value; } set { _value = value; } }
    
        public SelectedProfileName(string value)
        {
            this._value = value;
        }
    
        public static implicit operator string(SelectedProfileName d)
        {
            return d.Value;
        }
        public static implicit operator SelectedProfileName(string d)
        {
            return new SelectedProfileName(d);
        }
    
        public override string ToString()
        {
            return Value;
        }
    
        public TypeCode GetTypeCode()
        {
            return Value.GetTypeCode();
        }
    
        public bool ToBoolean(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToBoolean(provider);
        }
    
        public char ToChar(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToChar(provider);
        }
    
        public sbyte ToSByte(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToSByte(provider);
        }
    
        public byte ToByte(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToByte(provider);
        }
    
        public short ToInt16(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToInt16(provider);
        }
    
        public ushort ToUInt16(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToUInt16(provider);
        }
    
        public int ToInt32(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToInt32(provider);
        }
    
        public uint ToUInt32(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToUInt32(provider);
        }
    
        public long ToInt64(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToInt64(provider);
        }
    
        public ulong ToUInt64(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToUInt64(provider);
        }
    
        public float ToSingle(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToSingle(provider);
        }
    
        public double ToDouble(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToDouble(provider);
        }
    
        public decimal ToDecimal(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToDecimal(provider);
        }
    
        public DateTime ToDateTime(IFormatProvider provider)
        {
            return ((IConvertible)Value).ToDateTime(provider);
        }
    
        public string ToString(IFormatProvider provider)
        {
            return Value.ToString(provider);
        }
    
        public object ToType(Type conversionType, IFormatProvider provider)
        {
            return ((IConvertible)Value).ToType(conversionType, provider);
        }
    }
    

    绑定到它的文本框时出现的错误是:

    System.ArgumentException:“system.string”类型的对象不能为 已转换为“myapp.selectedprofilename”类型。

    我以为隐式算符是为了实现这一点?

    值得注意的是,这并不是直接绑定的,而是通过一个包装类来公开绑定用例中属性所需的属性和其他选项,这里是包装器,错误会抛出到value.set访问器上。

    public class PropertyValue : INotifyPropertyChanged
    {
        private PropertyInfo propertyInfo;
        private object baseObject;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public PropertyValue(PropertyInfo propertyInfo, object baseObject)
        {
            this.propertyInfo = propertyInfo;
            this.baseObject = baseObject;
    
            if (baseObject is INotifyPropertyChanged)
            {
                (baseObject as INotifyPropertyChanged).PropertyChanged += (s, e) =>
                {
                    if (e.PropertyName == propertyInfo.Name)
                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
                };
            }
        }
    
        public string name { get { return propertyInfo.Name; } }
    
        public string displayName { get { return propertyType.getCustomNameAttribute(); } }
    
        public Type propertyType { get { return propertyInfo.PropertyType; } }
    
        public object value
        {
            get { return propertyInfo.GetValue(baseObject, null); }
            set { propertyInfo.SetValue(baseObject, value, null); }
        }
    
        public bool isSetable { get { return propertyInfo.GetSetMethod() != null; } }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Wobbles    7 年前

    基本上,在通过反射进行设置时,转换器似乎不可用,这对我来说真的很糟糕(参考: https://stackoverflow.com/a/10693776/3797778 )中。

    我的实例可以通过绑定到对象来工作,尽管不是我最喜欢的工作方式 .Value 属性,而不仅仅是对象本身。需要调整一些数据模板,但我认为它可能工作。也可能意味着对我的所有类型实现“inotifypropertychanged”。