Мы все знаем, насколько бесполезна валидация WPF из коробки. Я пробую очень простую вещь, и по какой-то причине она всегда терпит неудачу. У меня есть TextBox, и мое единственное требование - подтвердить, что пользователь вводит что-то в TextBox. TextBox привязан к объекту Customer со свойствами FirstName и LastName.
Вот код XAML:
<TextBox Style="{StaticResource TextBoxStyle}" Grid.Column="1" Grid.Row="0" Height="20" Width="100" Margin="10">
<TextBox.Text>
<Binding Path="FirstName" >
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Вот свойство FirstName класса Customer:
public string FirstName
{
get { return _firstName;}
set
{
if(String.IsNullOrEmpty(value))
throw new ApplicationException("FirstName cannot be null or empty!");
_firstName = value;
OnPropertyChanged("FirstName");
}
}
Несмотря на то, что я выбрасываю исключение, если FirstName (значение) является нулевым или пустым, оно обрабатывается только в том случае, если я что-то наберу в TextBox, а затем удалю, а затем уберу вкладку. Причина в том, что это зависит от свойства измененного события. Но даже если я наложу эту привязку TextBox на Focus, она не сработает.
ОБНОВЛЕНИЕ:
Одним из самых уродливых способов решения этой проблемы является назначение String.Empty для TextBoxes в событии Window.Loaded:
void AddCustomerWindow_Loaded(object sender, RoutedEventArgs e)
{
// get all the textboxes and set the property to empty strings!
txtFirstName.Text = String.Empty;
txtLastName.Text = String.Empty;
}
Вот код для привязки:
public AddCustomerWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(AddCustomerWindow_Loaded);
gvAddCustomer.DataContext = new Customer();
}