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"/>
値が有効な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);
}
より詳細な例を次に示します。
次の解決策を試すことができます。まず、DoublePropertyをNullableとして宣言する必要があります。
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になります。