web-dev-qa-db-ja.com

WPFMVVMテキストボックスの検証

MVVMを使用してWPFアプリケーションを作成しています。 doubleタイプのViewModelのプロパティにバインドされたテキストボックスがあります。デフォルト値は0.0です。テキストボックスにテキスト値(たとえば、abc)を入力すると、フォーカスが失われると、テキストボックスが強調表示され、値が正しくないことが示されます。ただし、ユーザーは引き続き先に進み、[送信]をクリックしてViewModelコマンドを呼び出すことができます。テキストボックスのTextプロパティはViewModelのタイプdoubleのプロパティにバインドされているため、ViewModelプロパティにはデフォルト値0.0が含まれており、入力されたテキストを見つけることができません。ユーザーによる。

したがって、ユーザーが実際に値0を入力したのか、それとも間違った入力があったのかを判断できません。この検証を正しく実行するにはどうすればよいですか?入力したテキストを取得できるように、それをstringプロパティにバインドし、それをdouble値に解析して、入力が正しいかどうかを確認する必要がありますか?または、これを行うためのより良い方法はありますか?

<TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="{Binding DoubleProperty}" VerticalAlignment="Top" Width="120"/>
7
Fahad

値が有効なdoubleであるかどうかをチェックする検証ルールをテキストボックスのバインディングに添付できます。これにより、有効な値が入力されない限り、ユーザーは[送信]ボタンを押すことができなくなります。これにより、送信ボタンが有効になっている場合にのみ有効になるため、送信時にDoubleProperty値が有効かどうかを確認する必要がなくなります。簡単な例を次に示します。

<TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
        <TextBox.Text>
            <Binding Path="DoubleProperty">
                <Binding.ValidationRules>
                    <validationrules:NumberValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

上記の例では、ValidationRuleを継承するクラスNumberValidationRuleを定義する必要があります。

これがサンプルのNumberValidationRuleです

public class NumberValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        double result = 0.0;
        bool canConvert = double.TryParse(value as string, out result);
        return new ValidationResult(canConvert, "Not a valid double");
    }
}

検証ルールを追加すると、ValidationRuleクラスが有効な値ではないと言った場合、テキストボックスでテキストフィールドにエラーが発生します。

送信ボタンが有効にならないようにするには、wpfウィンドウが有効かどうかを確認するCanExecuteイベントを追加します。そのようです:

<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Save" CanExecute="Save_CanExecute" Executed="Save_Executed"/>
</Window.CommandBindings>

... The rest of your page

<Button Content="Save" HorizontalAlignment="Left" Margin="43,146,0,0" VerticalAlignment="Top" Width="75" Command="ApplicationCommands.Save"/>                            

と背後のコードで

private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = IsValid(sender as DependencyObject);
    }

private bool IsValid(DependencyObject obj)
    {            
        return !Validation.GetHasError(obj) && LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>().All(IsValid);
    }

より詳細な例を次に示します。

WPFでの検証

20
kmcnamee

次の解決策を試すことができます。まず、DoublePropertyNullableとして宣言する必要があります。

    public double? DoubleProperty { get; set; }

次に、実装されたコンバータークラスを作成します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)
    {
        double result;
        if(!double.TryParse((string)value, out result))
        {
            return null;
        }

        return result;
    }

最後に、あなたはそれを使うことができます:

    xmlns:converter="clr-namespace:[TestApplication]"

<Window.Resources>
    <converter:DoubleToStringConverter x:Key="doubleToStringConverter" />
</Window.Resources>

<TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="{Binding DoubleProperty, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource doubleToStringConverter}}" VerticalAlignment="Top" Width="120"/>

これで、ユーザーが間違った値を入力した場合、DoublePropertyはnullになります。

2
Yuri Dorokhov