Установите значение null в привязке WPF


пожалуйста, взгляните на следующую строку

<TextBox Text="{Binding Price}"/>

это свойство цены сверху является Decimal? (десятичное значение null).

Я хочу, чтобы если пользователь удаляет содержимое текстового поля (т. е. вводит пустую строку, она должна автоматически обновлять источник с null (ничего в VB).

есть идеи о том, как я могу сделать это "Xamly"?

3 108

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);
    }
}

(может потребоваться некоторая настройка, хотя)