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


116

다음 줄을보세요

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

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

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

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

답변:


226

.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"

도움이 되었기를 바랍니다.


13
실제로 TargetNullValue는 잘 작동합니다. 그것이하는 일은 주어진 값과 null 사이의 동등성을 설정하는 것입니다. 따라서이 경우 바인딩 된 값이 null이면 빈 문자열이 표시되고 대상 값이 빈 문자열이면 바인딩 된 값이 null로 설정됩니다.
Bryan Anderson

4
TargetNullValue가 작동합니다. 값 변환기를 사용할 때 동일한 결과를 얻었습니다. 다음 식을 단순화 할 수도 있습니다. <TextBox Text = "{Binding Price, TargetNullValue = ''}"/>
Gregor Slavec

2
나는 혼란 스럽습니다-OP는 "..it는 null로 소스를 자동으로 업데이트해야합니다 [Target이 빈 문자열 일 때]."라고 말합니다. 그러나 TargetNullValue 는 Source가 아닌 Target을 업데이트합니다 !
markmnl

1
당신은 유일한 혼란스러운 사람이 아닙니다-다른 답변에 대한 혼란스러운 의견도 있습니다. OP는 또한 소스 업데이트라고 말하면 실제로 WPF의 Target이 말하는 것을 의미합니다 (소스는 TextBox의 Text 속성입니다). TargetNullValue는 Target이 null 일 때 Source를 설정할 값을 나타냅니다. 반대로, 여기서 우리가 활용하는 것은 소스가이 지정된 값으로 업데이트 될 때 대상이 null로 설정된다는 것입니다.
Nathan Phillips

@markmnl TargetNullValue은 참으로 업데이트를위한 것이지만 Target아니라 Source,이 솔루션은 여전히 어떤 이유로 트릭을 (왜 확실히 알아낼 수) 않습니다.
Tim Pohlmann

12

이 값 변환기는 트릭을 수행해야합니다.

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소스가 아니라 소스의 속성입니다 ...


2
변환기는이 작업을 수행하는 적절한 방법이며 XAML에서 이러한 변환기를 정의 할 수 없습니다. 변환기를 사용하면 데이터 바인딩에서 기본 "개체 대 개체"변환 동작을 변경할 수 있습니다.
Will Eddins

제 경우의 문제는 이미 여기에서 다른 일을하는 컨버터를 사용하고 있다는 것입니다. 답변을 올렸습니다. 한 번보세요.
Shimmy Weitzhandler

(아마 대부분은 당신이 원하는) 널 (null)로 간주 할 ""수 있도록 IsNullOrWhiteSpace ()를 사용하는 것이 좋습니다
Simon_Weaver

+1 그러나 : 가격은 여기에서 귀하의 소스이지만 귀하는 정확합니다 TargetNullValue는 여기에서 적절하지 않습니다-TargetNullValue는 소스가 null 인 경우 대상 을 설정하는 반면 , 대상이 특정 값 (비어있는 경우) 인 경우 소스를 (null로) 설정하려고합니다. 문자열)-변환기가 수행합니다.
markmnl

5

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

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


나는 Xamly 방법을 선호하지만, 난 아무것도 생각할 수 없다
흔들 Weitzhandler에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.