當輸入字符串無效時,TextBoxes中的標準行爲是顯示紅色正方形(例如用戶在數字TextBox中引入字母)。這發生在TextBox失去焦點時。在驗證錯誤時取消TextBox輸入
我想實現這一行爲:
- 文本框失去焦點。
- TextBox做內部驗證(日期,數字等)。
- 如果輸入的用戶字符串無效,則舊值將被恢復,並且TextBox不會顯示任何錯誤。
當輸入字符串無效時,TextBoxes中的標準行爲是顯示紅色正方形(例如用戶在數字TextBox中引入字母)。這發生在TextBox失去焦點時。在驗證錯誤時取消TextBox輸入
我想實現這一行爲:
你有驗證的個例在文本框在這裏點擊此鏈接:http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF
<ControlTemplate x:Key="validationErrorTemplate">
<DockPanel>
<TextBlock Foreground="Red"
DockPanel.Dock="Top">!</TextBlock>
<AdornedElementPlaceholder
x:Name="ErrorAdorner"
></AdornedElementPlaceholder>
</DockPanel>
</ControlTemplate>
public class NameValidator : ValidationRule
{
public override ValidationResult Validate
(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
return new ValidationResult(false, "value cannot be empty.");
else
{
if (value.ToString().Length > 3)
return new ValidationResult
(false, "Name cannot be more than 3 characters long.");
}
return ValidationResult.ValidResult;
}
}
<TextBox Height="23" HorizontalAlignment="Left"
Grid.Column="1" Grid.Row="0" Name="textBox1"
VerticalAlignment="Top" Width="120"
Validation.ErrorTemplate="{StaticResource validationErrorTemplate}"
>
<TextBox.Text>
<Binding Path="Name" Mode="TwoWay"
UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<local:NameValidator></local:NameValidator>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
恢復到原來的值是很容易的,如果你使用MVVM。在您的ViewModel的道具設置器中,如果它無效並且調用PropertyChanged
,您可以簡單地將新值設置爲模型。這將告訴綁定的視圖元素調用你的屬性getter,它將返回舊值,並因此將視圖元素的內容還原爲舊值。
實施例(驗證該用戶輸入是int
值):
public string Number
{
get { return _model.Number.ToString(); }
set
{
if (_model.Number.ToString() != value)
{
int number;
if (int.TryParse(value, out number))
{
_model.Number = number;
}
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Number));
}
}
}
即用於視圖模型驗證工作正常。這裏的問題是當用戶引入一個無效的日期字符串,並且ViewModel中的屬性是DateTime。 TextBox自己進行內部驗證並顯示錯誤; textbox不會對viewmodel進行綁定,因爲它不能將字符串轉換爲DateTime,並且錯誤的日期字符串仍然存在。 – Poeta