全体のレイアウト作成
では、ページを作成していきましょう。作り方は、まずグリッドを9行に分割し、1行ずつStackPanelでTextBlockとGcTextBoxコントロールを配置していくだけです。
グリッドと見出しの作成
グリッドはRowDefinitionsプロパティで複数行に分割し、最初の行にTextBlockで見出しと説明文を入れます。
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="450" Height="600" >
<Border BorderThickness="2" BorderBrush="Cyan">
<Grid ShowGridLines="True" >
<Grid.RowDefinitions>
<RowDefinition Height="80"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Vertical">
<TextBlock Text="節電アンケート" HorizontalAlignment="Center" FontSize="18" Foreground="MediumPurple">
<TextBlock.Effect>
<DropShadowEffect BlurRadius="2" Color="DarkGray" ShadowDepth="3"></DropShadowEffect>
</TextBlock.Effect>
</TextBlock>
<TextBlock Text="節電に関するアンケートにご協力ください。" VerticalAlignment="Center" Height="22"
Width="240" Margin="20" />
氏名入力のTextBoxコントロールに検証機能をバインドする
グリッドの2行目に、氏名を入力する欄をSilverlight標準のTextBoxコントロールで作成します。そして、このコントロールで、入力が空白だった時にアラーム表示をする検証インジケータを設定します。
コントロールのレイアウト
まず、StackPanelコントロールでTextBlock、TextBox、GcValidationIndicatorコントロールを配置します。
GcValidationIndicatorコントロールは、先に「im」という名前空間を設定していますので、XAMLでコントロールを記述する際は「<im:GcValidationIndicator>」と記述します。そして、Nameプロパティで名前を付け、ElementNameプロパティでTextBoxコントロールに関連づけます。
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBlock Text="氏名:" VerticalAlignment="Center" Margin="5" />
<TextBox Name="TextBox1" Width="120">
</TextBox>
<im:GcValidationIndicator Name="GcValidationIndicator1" Width="16" Height="16"
ElementName="TextBox1" />
</StackPanel>
空白時のエラー表示を行う検証機能の作成
このGcValidationIndicatorコントロールは、Bindingオブジェクトを使って検証機能を実装させます。まず、XAMLに「local」という名前空間を作成します。
xmlns:local="clr-namespace:sl_varid_vb"
xmlns:local="clr-namespace:sl_varid_cs"
そして、StackPanelのResourceプロパティにこの名前空間を設定します。
<StackPanel Grid.Row="1" Orientation="Horizontal">
<StackPanel.Resources>
<local:Person x:Key="Person" />
</StackPanel.Resources>
続いて、TextBoxコントロールのTextプロパティにBindingオブジェクトを組み込みます。
ValidatesOnNotifyDataErrorsプロパティは、バインディングエンジンが検証エラーを報告するかどうかを示す値を、取得または設定するものです。ここではエラーを報告しないようにします。ValidatesOnExceptionsプロパティは、例外検証エラーを報告するかどうかを示す値を取得または設定するプロパティで、ここでは報告するようにします。
<TextBlock Text="氏名:" VerticalAlignment="Center" Margin="5" />
<TextBox Name="TextBox1" Width="120">
<TextBox.Text>
<Binding Mode="TwoWay" Source="{StaticResource Person}" Path="Text"
ValidatesOnNotifyDataErrors="False" ValidatesOnExceptions="true" />
</TextBox.Text>
</TextBox>
<im:GcValidationIndicator Name="GcValidationIndicator1" Width="16" Height="16"
ElementName="TextBox1" />
</StackPanel>
入力検証クラスの作成
今度は、ビハインドコードで検証を行うクラス「Person」を作成します。
まず、プロジェクトの[参照設定]に、「System.ComponentModel.DataAnnotations」を追加します。これは、ValidatorクラスのValidatePropertyメソッドを使用して、コントロールの入力が空白かどうかの検証を行うためです。また、各コードの先頭にこの名前空間を宣言しておきます。
クラス「Person」では、例外検証エラー時のメッセージとプロパティ「Text」を作成し、ValidatePropertyメソッドを実行してプロパティの値が空白の時エラーメッセージをGcValidationIndicatorコントロールに渡すようにします。これで、TextBoxコントロールのTextプロパティが空白のまま他のコントロールにフォーカスが移動すると、GcValidationIndicatorコントロールはアイコンを点滅させ、検証エラーメッセージをツールチップで表示します。
Imports System.ComponentModel.DataAnnotations
Partial Public Class MainPage
...
...
End Class
Public Class Person
Private _Text As String = "Text"
<Required(ErrorMessage:="入力必須項目です。")>
Public Property Text() As String
Get
Return _Text
End Get
Set(ByVal value As String)
' アノテーションにしたがって検証を実行します。
Validator.ValidateProperty(value, New ValidationContext(Me, Nothing, Nothing) With {.MemberName = "Text"})
_Text = value
End Set
End Property
End Class
using System.ComponentModel.DataAnnotations;
namespace sl_varid_cs
{
public partial class MainPage : UserControl
{
...
...
}
public class Person
{
private string _Text = "Text";
// プロパティの値を必須として指定します。
[Required(AllowEmptyStrings = false, ErrorMessage = "入力必須項目です。")]
public string Text
{
get { return _Text; }
set
{
// アノテーションにしたがって検証を実行します。
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Text" });
_Text = value;
}
}
}
