2016-03-16 34 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); 
    } 
}