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
,它可以处理赋值给一个可为空的数值(就像textboxTextProperty
那样)
我基本上从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?、等等。。。没什么特别的。我不认为它需要实际的财产,因为我已经知道需要对它做什么了。乔普,我已经看到了你的答案,并投票表决了。很高兴您找到了答案并与我们分享;)酷。我想一定是的,但我想我应该先检查一下。