Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# 2008 Step by Step.pdf
Скачиваний:
16
Добавлен:
25.03.2016
Размер:
13.96 Mб
Скачать

Chapter 24 Performing Validation

491

4.In the Gender group box, click the Female radio button.

Again, the checkTitleAndGender method generates an exception, and the Female radio button appears highlighted with a red border. Rest the mouse pointer on the Female combo box, and verify that the ScreenTip text “The gender must match the title of the customer” appears.

5.On the File menu, click Save.

A message box appears, displaying the title (“Mr”) and the gender (“Female”) of the customer. Although the form contains erroneous and missing data (you have not entered a name), you can still save the data!

6.Click OK, and then type a name in the foreName and lastName text boxes, but do not click away from the lastName text box.

7.On the File menu, click Save again.

The message box now includes the first name of the customer but not the last name. This happens because the lastName text box on the form has not lost the focus. Remember from earlier that data binding validation for a text box occurs only when the

user clicks another control on the form. The same applies to the data itself; by default, it is copied to the customerDetails object only when the text box loses the focus. In fact, it is the act of copying the data from the form to the customerDetails object that triggers the validation.

8.Click OK, and then click the Title combo box. Set the title to “Mrs”. On the File menu, click Save.

This time, the message box displays the first name and last name of the customer. Also, although the title (“Mrs”) and gender (“Female”) now match, the radio button still flags an error.

9.Click OK, close the application, and return to Visual Studio 2008.

Changing the Point at Which Validation Occurs

The issue with the Customer Information application is that the validation is performed at the wrong time, is inconsistently applied, and does not actually prevent the user from saving inconsistent data. You just need an alternative approach to handling the validation. The solution is to check the user’s input only when the user saves the data. This way, you can ensure that the user has finished entering all the data and that it is consistent. If there are any problems, you can display an error message and prevent the data from be-

ing saved until the problems have been corrected. In the following exercise, you will modify the Customer Information application to postpone validation until the user attempts to save the customer information.

492

Part IV Working with Windows Applications

Validate data explicitly

1.Return to the Design View window displaying CustomerForm.xaml. In the XAML pane, modify the binding for the title combo box and set the UpdateSourceTrigger property to “Explicit”, as shown in bold type here:

<ComboBox ... Name=”title” ...>

...

<ComboBox.Text>

<Binding Source=”{StaticResource customerData}” Path=”Title” Converter=”{StaticResource titleConverter}” UpdateSourceTrigger=”Explicit” >

...

</Binding>

</ComboBox.Text>

</ComboBox>

The UpdateSourceTrigger property governs when the information entered by the user is sent back to the underlying Customer object and validated. Setting this property to “Explicit” postpones this synchronization until your application explicitly performs it by

using code.

2.Modify the bindings for the foreName and lastName text boxes to set the

UpdateSourceTrigger property to “Explicit”:

<TextBox ... Name=”foreName” ... > <TextBox.Text>

<Binding Source=”{StaticResource customerData}” Path=”ForeName”

UpdateSourceTrigger=”Explicit” >

...

</Binding>

</TextBox.Text>

</TextBox>

...

<TextBox ... Name=”lastName” ... > <TextBox.Text>

<Binding Source=”{StaticResource customerData}” Path=”LastName”

UpdateSourceTrigger=”Explicit” >

...

</Binding>

</TextBox.Text>

</TextBox>

The application is not going to check consistency between the title and gender of the

customer until the user saves the customer information. If the validation rule for the Title property passes, there is no need to validate the Gender property. Similarly, if the validation rule for the Title property fails, there is no need to examine the Gender property. In other words, the validation rule for the Gender radio buttons on the form is now redundant, so remove it. To do so, remove the Binding.ValidationRules and ExceptionValidationRule elements from the bindings for the male and female radio buttons. Do not set the UpdateSourceTrigger property of the bindings to “Explicit”.

Chapter 24 Performing Validation

493

3.Return to the Code and Text Editor window displaying the CustomerForm.xaml.cs file. In the rebuildBinding method, locate the statement that adds the validation rule to the binding and comment it out as shown in bold type here:

private Binding rebuildBinding(string parameter)

{

...

// binding.ValidationRules.Add(new ExceptionValidationRule());

...

}

4.In the saveCustomer_Click method, add the statements shown here in bold type to the start of the method:

private void saveCustomer_Click(object sender, RoutedEventArgs e)

{

BindingExpression titleBe = this.title.GetBindingExpression(ComboBox.TextProperty);

BindingExpression foreNameBe = this.foreName.GetBindingExpression(TextBox.TextProperty);

BindingExpression lastNameBe = this.lastName.GetBindingExpression(TextBox.TextProperty);

...

}

These statements create BindingExpression objects for each of the three controls with

binding validation rules. In an earlier exercise in this chapter, you saw that you can use a BindingExpression object to ensure that the data displayed on the form is synchronized with the data in the Customer object by calling the UpdateTarget method. The BindingExpression class also provides the UpdateSource method, which synchronizes

data the other way around, sending the values in the bound properties of controls on the form back to the Customer object. When this occurs, the data will also be validated.

5.Add the following statements shown in bold type to the saveCustomer_Click method after the code you added in the preceding step:

private void saveCustomer_Click(object sender, RoutedEventArgs e)

{

...

titleBe.UpdateSource();

foreNameBe.UpdateSource();

lastNameBe.UpdateSource();

...

}

These statements update the properties in the Customer object with the values entered

by the user on the form, and they validate the data as they do so. Notice that there is no need to update the Gender property manually because you did not set the UpdateSourceTrigger property to “Explicit” for the binding for the radio buttons; the

Gender property is still updated automatically.

494 Part IV Working with Windows Applications

The BindingExpression class provides a property called HasError that indicates whether the UpdateSource method was successful or whether it caused an exception.

6.Add the code shown here in bold type to the saveCustomer_Click method to test the HasError property of each BindingExpression object and display a message if the validation fails. Move the original code that displays the customer details to the else part of the if statement.

private void saveCustomer_Click(object sender, RoutedEventArgs e)

{

...

if (titleBe.HasError || foreNameBe.HasError || lastNameBe.HasError)

{

MessageBox.Show(“Please correct errors”, “Not Saved”);

}

else

{

Binding customerBinding =

BindingOperations.GetBinding(this.title, ComboBox.TextProperty); Customer customer = customerBinding.Source as Customer; MessageBox.Show(customer.ToString(), “Saved”);

}

}

Test the application again

1.On the Debug menu, click Start Without Debugging to build and run the application.

2.When the Customer Details form appears, set the Title combo box to “Mrs”. Notice that the combo box is not highlighted because it has not yet been validated.

3.On the File menu, click Save.

A message box should appear with the message “Please correct errors,” and the Title and Name fields on the form should be highlighted. This is because the value in the Title combo box does not match the gender, and you have left the Name fields blank. If you rest the mouse on the fields highlighted with the red border, the ScreenTips display the reason for the error message.

4.Click OK to close the message box.

5.Click the Female radio button, and then enter a first name and last name for the customer.

Notice that the highlighting of the controls with errors does not disappear.

6.On the File menu, click Save again.

This time, the data is complete and consistent. A message box should appear, displaying the full details of the customer, and the highlighting on the form disappears.

7.Click OK, and exit the application.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]