[wpf] WPF 바인딩에서 값을 null로 설정

다음 줄을보세요

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

위의이 Price 속성은 Decimal?(Nullable decimal)입니다.

사용자가 텍스트 상자의 내용을 삭제하면 (즉, 빈 문자열을 입력하면 자동으로 null (VB의 Nothing)으로 소스를 업데이트해야합니다.)

‘Xamly’를 어떻게 할 수 있는지에 대한 아이디어가 있습니까?



답변

.NET 3.5 SP1을 사용하고 있으므로 매우 간단합니다.

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

(귀하의 의견에 대해 Gregor에게 감사드립니다) :

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

리소스에서이 변환기의 인스턴스를 선언합니다.

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

(하지만 약간의 조정이 필요할 수 있습니다)


답변