Установить значение null в привязке WPF
пожалуйста, взгляните на следующую строку
<TextBox Text="{Binding Price}"/>
Это свойство цены выше, чем Decimal?
(Nullable decimal).
Я хочу, чтобы, если пользователь удаляет содержимое текстового поля (т.е. входит в пустую строку, он должен автоматически обновлять источник с помощью null (Nothing in VB).
Любые идеи о том, как я могу это сделать "Xamly"?
Ответы
Ответ 1
Я использую .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"
Надеюсь, что это помогло.
Ответ 2
Этот преобразователь значений должен выполнить трюк:
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
не является источником, это свойство источника...
Ответ 3
Вы можете попробовать использовать 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);
}
}
(Возможно, нужна какая-то настройка)