C# 字符串从属属性为Nullable

C# 字符串从属属性为Nullable,c#,dependency-properties,C#,Dependency Properties,我想创建一个字符串dependencProperty,它可以处理赋值给一个可为空的数值(就像textboxTextProperty那样) 我基本上从TextBox复制了反编译的代码,并将其更改为我正在创建的dependencProperty [DefaultValue(null)] //[DefaultValue(string.Empty)] [Localizability(LocalizationCategory.Text)] public string Number { get {

我想创建一个字符串
dependencProperty
,它可以处理赋值给一个可为空的数值(就像textbox
TextProperty
那样)

我基本上从
TextBox
复制了反编译的代码,并将其更改为我正在创建的
dependencProperty

[DefaultValue(null)]
//[DefaultValue(string.Empty)]
[Localizability(LocalizationCategory.Text)]
public string Number
{
    get { return (string)GetValue(NumberProperty); }
    set { SetValue(NumberProperty, value); }
} 

public static readonly DependencyProperty NumberProperty =
        DependencyProperty.Register(
                "Number", // Property name
                typeof(string), // Property type
                typeof(NumberControl), // Property owner 
                new FrameworkPropertyMetadata( // Property metadata
                        null, // default value 
                        //string.Empty, // default value
                        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | // Flags 
                            FrameworkPropertyMetadataOptions.Journal,
                        OnNumberPropertyChanged,    // property changed callback 
                        CoerceText,
                        true, // IsAnimationProhibited
                        UpdateSourceTrigger.PropertyChanged   // DefaultUpdateSourceTrigger
                        ));
private static object CoerceText(DependencyObject d, object value)
{
    var sv = value as string;
    if (sv == String.Empty) return null;
    return value;
    //if( value == null) return string.Empty;
}

private static void OnNumberPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var tb = (NumberControl) d;
    if (tb.Number != tb.Text)
    {
        tb.Text = tb.Number;
    }
}
但是,当将此属性绑定到十进制时?这是发生的异常

System.Windows.Data错误:7:ConvertBack无法转换值“”(类型为“字符串”)。BindingExpression:Path=DecimalProperty;DataItem='MainWindowViewModel'(HashCode=58431997);目标元素为'NumberControl'(名称='');目标属性是'Number'(类型'String')FormatException:'System.FormatException:输入字符串的格式不正确。
在System.Number.StringToNumber(字符串str、NumberStyles选项、NumberBuffer&Number、NumberFormatInfo、布尔解析十进制)中
在System.Number.ParseDecimal处(字符串值、NumberStyles选项、NumberFormatInfo numfmt)
在System.Convert.ToDecimal(字符串值,IFormatProvider提供程序)
在System.Convert.ChangeType(对象值、类型转换类型、IFormatProvider提供程序)中
位于System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter转换器,对象值,类型sourceType,对象参数,CultureInfo区域性)'

注意:我试图保留默认的string.empty行为,但它不起作用,我提供的代码尝试为null,但也不起作用


是否有某种方式使
TextBox.Text
指定了其他一些默认转换器?

快速回答

您需要在为该
dependancProperty
指定的
PropertyChangedCallback
方法中将
dependancProperty
直接设置为
null
,以便它不使用默认转换器

因此在我的例子中,
OnNumberPropertyChanged
方法作为
DependencyProperty
中的
PropertyChangedCallback
需要调用

tb.SetValue(NumberProperty, null);
长答案

该死的,我找到了这个,在发布我的问题后,这个问题的措辞并不像我搜索时那样,直到我在问题的末尾发布了“默认转换器”

我让它工作的方法是在代码的适当时间手动将
dependancProperty
值设置为
null

    if (tb.Number == null)
    {
        tb.SetValue(NumberProperty, null);
    }
因此,完整的OnNumberPropertyChanged方法是:

    /// <summary> 
    /// Callback for changes to the Number property 
    /// </summary>
private static void OnNumberPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var tb = (NumberControl) d;
    if (tb.Number != tb.Text)
    {
        tb.Text = tb.Number;
    }
    if (tb.Number == null)
    {
        tb.SetValue(NumberProperty, null);
    }
}
//
///回调以更改Number属性
/// 
NumberPropertyChanged上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
var tb=(NumberControl)d;
if(tb.Number!=tb.Text)
{
tb.Text=tb.Number;
}
if(tb.Number==null)
{
tb.SetValue(NumberProperty,null);
}
}

请将您的属性绑定添加到您的问题中,好吗?绑定到的属性是十进制的?在PropertyChanged()上实现的,但可以是任何可为空的结构,例如int?、decimal?、double?、等等。。。没什么特别的。我不认为它需要实际的财产,因为我已经知道需要对它做什么了。乔普,我已经看到了你的答案,并投票表决了。很高兴您找到了答案并与我们分享;)酷。我想一定是的,但我想我应该先检查一下。