0

10 進数値にバインドされたテキスト ボックスがあります。ここで、100 のような何かを入力して、完全にクリア (空) するとします。データを保存すると、10 進数で 1 が保存されます。同様に、200 を試してテキスト ボックスをクリアすると、2 が保存されます。10 進数値は null ではないことに注意してください。何か案は?

<TextBox 
    Height="23" 
    VerticalAlignment="Center" 
    Text="{Binding Discount,Mode=TwoWay}" 
    MaxLength="50" 
    TabIndex="28" 
    Grid.Row="2" 
    Grid.Column="1" 
    local:FocusExtension.IsFocused=
        "{Binding Path=IsDiscountFocused,Mode=TwoWay}" 
    Margin="5,0,0,0"/>
4

2 に答える 2

4

String.Empty は、デフォルトでは 10 進数に変換できないためです。最後の有効な値がプロパティに保持されます。以下のようにコンバーターを使用する必要があります。

WPF

<Window.Resources>
    <local:ValueConverter x:Key="valueConverter" />
</Window.Resources>

<TextBox Text="{Binding Path=Value, Mode=TwoWay, Converter={StaticResource valueConverter}}" />

コンバータ:

public class ValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is string && (string)value == "")
        {
            return 0;
        }

        return value;
    }
}

クリア:

public decimal Value
{
    get { return (decimal)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}
于 2012-11-15T08:39:28.393 に答える
0

ビューモデルの割引プロパティが次のようになっていると仮定します。

public decimal Discount {get;set;}

バックスペースを使用してテキストボックスをクリアすると、"" は 10 進数に変換できないため、バインド例外が発生します。したがって、最後の番号はあなたの財産に残ります。実際には、これは UpdateSourceTrigger=Propertychanged を使用するときに発生するはずです。それでも、decimal? を使用してみることができます。これが役に立たない場合は、コンバーターを追加して、ビューモデルが処理できる値に "" を変換することもできます。

編集:最後のコメントを見ませんでした。ただし、空のテキスト ボックスに 0 が必要な場合は、"" が入力のときにコンバーターを使用して 0 を返すだけです。

于 2012-11-15T08:19:41.170 に答える