Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义类型不会隐式地从字符串转换为绑定_C# - Fatal编程技术网

C# 自定义类型不会隐式地从字符串转换为绑定

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)

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

基本上,通过反射设置时,转换器似乎不可用,这对我来说真的很糟糕(参考:)


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

抛出的错误是哪一行?@Scriven它实际上是在我正在使用的包装器类型中抛出的,尝试使用
propertyInfo.SetValue(baseObject,value,null)将值设置回对象,这适用于普通字符串等,我想我在某处缺少了一个额外的转换器。@scriben跟踪最终在System.RuntimeType.TryChangeType(对象值、绑定器绑定器、CultureInfo区域性、Boolean needsSpecialCast)的
处失败。
我想你的类也需要实现
IConvertible
@Amy,但当我通过
Value
实现该接口时,同样的问题将更新代码以显示我添加的内容。