2

null許容intにデータバインドしようとしているXAMLにTextBoxがあります。これは私のテキストボックスとリンクされたコンバーターのコードです:

<TextBox x:Name="textArea" InputScope="Number" Text="{Binding Area, Mode=TwoWay, Converter={StaticResource NullableValueConverter}}" />

public class NullableValueConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        if (String.IsNullOrEmpty(value.ToString()))
        {
            return null;
        }

        return value;
    }
}

このテキストボックスに数値を入力するたびに、データバインドが機能していないようで、データソースは常に null のままになります。どうすればこれを回避できますか?

XAML と C# を使用して Windows ストア アプリケーションを設計しています。

前もって感謝します。

4

3 に答える 3

6

私はサチャの答えに同意しますが、NullableValueConverter が必要な場合は改善されるでしょう

public class NullableValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          CultureInfo culture)
    {
        return value == null ? string.Empty : value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                              CultureInfo culture)
    {
        string s = value as string;

        int result;
        if (!string.IsNullOrWhiteSpace(s) && int.TryParse(s, out result))
        {
            return result;
        }

        return null;
    }
}

これは WPF を使用してテストされているため、メソッド シグネチャは WinRT とは異なる場合があることに注意してください。

于 2013-03-14T10:33:39.873 に答える
2

Windows ストア アプリのクラスにはTargetNullValueプロパティがありません。Binding

NullableValueConverterPhil のアプローチは有効であり、正常に動作します。ただし、彼が提案したように (そして、独自のバージョンの で既に行ったように) 、正しいメソッド シグネチャを使用していることを確認してください。

public class NullableValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value == null ? string.Empty : value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        string s = value as string;

        int result;
        if (!string.IsNullOrWhiteSpace(s) && int.TryParse(s, out result))
        {
            return result;
        }

        return null;
    }
}
于 2013-03-15T06:05:45.107 に答える
2

バインディング ハンドルで TargetNullValue. やや好き:

mscorlib を追加する必要があります。

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

バインディングを次のように更新します。

 Source="{Binding Area,
          TargetNullValue={x:Static sys:String.Empty},
          Converter={StaticResource NullableValueConverter}}"

XAML で null 値をチェックする場合、実際には NullableValueConverter は必要ありません。これはもちろん、コンバーターが他に何を処理する必要があるかによって異なります。

または、 IDataErrorInfoを実装することもできます。それはもう少し複雑です。

于 2013-03-14T10:24:02.300 に答える