C# 自定义类型不会隐式地从字符串转换为绑定
我创建了一个自定义类型,如下所示,它基本上是一个字符串,但当绑定到WP中时,if会给出一个转换异常C# 自定义类型不会隐式地从字符串转换为绑定,c#,C#,我创建了一个自定义类型,如下所示,它基本上是一个字符串,但当绑定到WP中时,if会给出一个转换异常 public class SelectedProfileName: IConvertible { private string _value; public string Value { get { return _value; } set { _value = value; } } public SelectedProfileName(string value)
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; } }
}
基本上,通过反射设置时,转换器似乎不可用,这对我来说真的很糟糕(参考:)
我的实例可以通过直接绑定到对象
.Value
属性而不是仅绑定到对象本身来解决,尽管这不是我最喜欢的方式。需要调整一些数据模板,但我认为它可能会工作。也可能意味着对我的所有类型实现“INotifyPropertyChanged”。抛出的错误是哪一行?@Scriven它实际上是在我正在使用的包装器类型中抛出的,尝试使用propertyInfo.SetValue(baseObject,value,null)将值设置回对象代码>,这适用于普通字符串等,我想我在某处缺少了一个额外的转换器。@scriben跟踪最终在System.RuntimeType.TryChangeType(对象值、绑定器绑定器、CultureInfo区域性、Boolean needsSpecialCast)的处失败。
我想你的类也需要实现IConvertible
@Amy,但当我通过Value
实现该接口时,同样的问题将更新代码以显示我添加的内容。