2016-03-16 41 views
1

我想要一个字符串DependencyProperty它可以处理分配给一个可为空的数值(如文本框TextProperty一样)。字符串DependencyProperty为可为空

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

[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 Error: 7 : ConvertBack cannot convert value '' (type 'String'). BindingExpression:Path=DecimalProperty; DataItem='MainWindowViewModel' (HashCode=58431997); target element is 'NumberControl' (Name=''); target property is 'Number' (type 'String') FormatException:'System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Convert.ToDecimal(String value, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

注意除外:我想离开默认的String.Empty行为,没有工作,我所提供的代码尝试空它也不起作用

TextBox.Text指定了其他一些默认转换器吗?

+0

你可以添加你的财产对你的问题有约束力吗? – ckruczek

+0

它绑定的属性是小数?实现OnPropertyChanged(),但可以是任何可为空的结构,例如,int?,decimal ?, double ?,等等......没什么特别的。我不认为它现在需要实际的财产,我已经知道需要做什么。 –

+1

Jop我已经看到并投票了你的答案。很高兴你找到答案并与我们分享;) – ckruczek

回答

1

快速解答

您需要直接与设置DependancyPropertynull在该DependancyProperty,以便它不使用默认的转换器指定的PropertyChangedCallback方法。

所以在我的情况下,OnNumberPropertyChanged方法正被用作需要DependancyPropertyPropertyChangedCallback调用

tb.SetValue(NumberProperty, null); 

长的答案

哎呀我发现这个questionanswer发布我的问题后, ,这个问题并没有真正表达出我的搜索想法,直到我在问题的最后发布了“默认转换器”。

我得到它的工作是对DependancyProperty值在与码适当的时候手动设置为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); 
    } 
}