我创建了一个自定义类型,基本上是一个字符串,但是当绑定到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; } }
}