web-dev-qa-db-ja.com

WPFバインディングで値をnullに設定します

次の行を見てください

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

上記のこのPriceプロパティはDecimal?(ヌル可能10進数)。

ユーザーがテキストボックスのコンテンツを削除した場合(つまり、空の文字列を入力した場合、null(VBではNothing)でソースを自動的に更新する必要があります。

「Xamly」を実現する方法についてのアイデアはありますか?

113
Shimmy

.NET 3.5 SP1を使用しているため、非常に簡単です。

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

これは(コメントについてグレゴールに感謝します):

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sysは、Systemmscorlibのインポートされたxml名前空間です。

xmlns:sys="clr-namespace:System;Assembly=mscorlib"

お役に立てば幸いです。

220
Shimmy

この値コンバーターはトリックを行う必要があります:

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はソースではなく、ソースのプロパティです...

11
Thomas Levesque

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

(ただし、微調整が必​​要な場合があります)

5
TimothyP