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に設定されます。
ブライアンアンダーソン、

4
TargetNullValueが機能します。値コンバーターを使用しても同じ結果が得られました。次の式を簡略化することもできます:<TextBox Text = "{Binding Price、TargetNullValue = ''}" />
Gregor Slavec

2
私は混乱している- OPは言う:「..itはautomatcallyヌルでソースを更新する必要があります[ターゲットは空の文字列であるとき]。」が、TargetNullValueは更新対象ではなく、ソースを
markmnl 2013

1
混乱しているのはあなただけではありません。他の回答にも混乱したコメントがあります。OPも少し混乱しています。彼がソースを更新すると言うとき、彼は実際にはWPFのターゲットを意味します(ソースはTextBoxのTextプロパティです)。TargetNullValueは、TargetがnullのときにSourceに設定する値を示します。これとは逆に、ここで利用しているのは、ソースがこの指定された値に更新されると、ターゲットがnullに設定されることです。
Nathan Phillips

@markmnl TargetNullValueは確かにではTargetなくを更新することを目的としていますがSource、この解決策はまだ何らかの理由でトリックを実行します(理由を完全に理解できませんでした)。
Tim Pohlmann 2016

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で定義することはできません。コンバーターを使用すると、データバインディングのデフォルトの「オブジェクトからオブジェクト」への変換動作を変更できます。
Eddinsは

私の場合の問題は、別のことを行う変換器をすでにここで使用していることです。回答を掲載しましたので、ご覧ください。
Shimmy Weitzhandler 2009

IsNullOrWhiteSpace()を使用して、 ""をnullとしてカウントできるようにすることをお勧めします(おそらく、必要なもの)
Simon_Weaver

+1ただし、ここでは価格がソースですが、正しいです。ここではTargetNullValueは適切ではありません-TargetNullValueはソースがnullの場合にターゲットを設定します- ターゲットが特定の値(空)の場合はソースを(nullに)設定します文字列)-コンバータが行うこと。
markmnl 2013

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の方法を好みますが、何も考えられません
Shimmy Weitzhandler 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.