Reputation: 104741
Please take a look at the following line
<TextBox Text="{Binding Price}"/>
This Price property from above is a Decimal?
(Nullable decimal).
I want that if user deletes the content of the textbox (i.e. enters an empty string), it should automatically update the data source (the target of the binding) with null (Nothing in VB).
Any ideas on how I can do it in XAML?
Upvotes: 124
Views: 55581
Reputation: 104741
I am using .NET 3.5 SP1 so it's very simple:
<TextBox Text="{Binding Price, TargetNullValue=''}"/>
Which stands for (thanks Gregor for your comment):
<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>
sys
is the imported xml namespace for System
in mscorlib
:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Hope that helped.
Upvotes: 240
Reputation: 292455
This value converter should do the trick :
public class StringToNullableDecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
decimal? d = (decimal?)value;
if (d.HasValue)
return d.Value.ToString(culture);
else
return String.Empty;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
string s = (string)value;
if (String.IsNullOrEmpty(s))
return null;
else
return (decimal?)decimal.Parse(s, culture);
}
}
Declare an instance of this converter in the ressources :
<Window.Resources>
<local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>
And use it in your binding :
<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>
Note that TargetNullValue
is not appropriate here : it is used to define which value should be used when the source
of the binding is null. Here Price
is not the source, it's a property of the source...
Upvotes: 12
Reputation: 21755
You can try using a ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
Of the back of my head here, something like:
public class DoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return (double)value;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
var doubleValue = Convert.ToDouble(value);
return (doubleValue == 0 ? null : doubleValue);
}
}
(Might need some tweaking though)
Upvotes: 5