Установите значение null в привязке WPF
пожалуйста, взгляните на следующую строку
<TextBox Text="{Binding Price}"/>
это свойство цены сверху является Decimal?
(десятичное значение null).
Я хочу, чтобы если пользователь удаляет содержимое текстового поля (т. е. вводит пустую строку, она должна автоматически обновлять источник с null (ничего в VB).
есть идеи о том, как я могу сделать это "Xamly"?
3 ответа:
Я использую .NET 3.5 SP1, так что это очень просто:
<TextBox Text="{Binding Price, TargetNullValue=''}"/>
что означает (спасибо Грегор за ваш комментарий):
<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>
sys
- это импортированное пространство имен xml дляSystem
наmscorlib
:xmlns:sys="clr-namespace:System;assembly=mscorlib"
надеюсь, что помогла.
этот конвертер значений должен сделать трюк:
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); } }
объявите экземпляр этого конвертера в ressources:
<Window.Resources> <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/> </Window.Resources>
и использовать его в привязке:
<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>
отметим, что
TargetNullValue
здесь не подходит : он используется для определения того, какое значение следует использовать, когдаsource
привязки имеет значение null. ЗдесьPrice
это не источник, это свойство источника...
вы можете попробовать использовать ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
из моего затылка здесь, что-то вроде:
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); } }
(может потребоваться некоторая настройка, хотя)