スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

数値入力オンリーにしなくたって方法はある。かな。

数値入力オンリーのテキストボックスだって作れるんだぞ。で書いたように、数値入力だけ受け付けるテキストボックスを作るまでの情熱や時間がないときは、ValidationRuleクラスを使う手もある。
ValidationRuleは、入力された値に対して独自のチェックを付けられるクラス。依存関係プロパティの値決定における順序で言えば、一番最後になるかな。数値チェックだけでなく、桁数や範囲も指定でき、且つエラー内容を自分好みのメッセージにもできる。数値型プロパティとTextBox.Textプロパティとのバインドで使ったウィンドウをベースに、ValidationRuleを設定してみる。

○カスタムなマイValidationRuleクラスを作る。
namespace TawamureDays {

/// <summary>
/// 数値入力を検証する為のクラス
/// </summary>
public class DecimalValidationRule : ValidationRule {

/// <summary>
/// 空入力を認めますか?
/// </summary>
public bool IsNullOK { get; set; }

/// <summary>
/// 値の検証チェックを行います。<br/>
/// falseをセットして返すと、バインディングエラーと同じ感じになります。<br/>
/// </summary>
/// <param name="value">チェックするバインディング ターゲットの値。</param>
/// <param name="cultureInfo">この規則で使用するカルチャ。</param>
/// <returns>ValidationResultオブジェクト</returns>
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) {
if (value == null || value.ToString() == string.Empty) {
if (IsNullOK) {
return ValidationResult.ValidResult;
} else {
return new ValidationResult(false, "必ず入力してね");
}
}

var decVal = decimal.Zero;

if (!decimal.TryParse(value.ToString(), out decVal)) {
return new ValidationResult(false, "数値を入力してね!");
}

return ValidationResult.ValidResult;
}
}
}
IsNullOK:空入力を認めるかどうかのプロパティ。
Validateメソッド:引数の値(value)を検証して、結果(ValidationResult)を返す。OKなら一々インスタンスを作らずに、ValidationResult.ValidResultを返すと節約になる。

○実際に使う。
このValidationRuleを使う。ただし、Binding周りのXAML記述がややこしくなるかなぁ。
<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tw="http://schemas.tawamuredays.jp/wpf/gui"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<tw:NullableDecimal2StringConverter x:Key="NullableDecimal2StringConverter"/>
</Window.Resources>
<tw:TawamureContents>
<StackPanel>
<TextBox DataContext="{Binding NumericBoxVM}"
tw:FrameworkElementBehavior.UpdatePropertySourceWhenEnterPressed="TextBox.Text">
<TextBox.Text>
<Binding Path="InputValue"
Converter="{StaticResource NullableDecimal2StringConverter}">
<Binding.ValidationRules>
<local:DecimalValidationRule IsNullOK="False"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
<tw:TawamureContents.Footer>
<Button Content="終われ!" Command="{Binding CloseCommand}"/>
</tw:TawamureContents.Footer>
</tw:TawamureContents>
</Window>
IsNullOK="False"にしているので、空入力は認められずエラーになる。
でも、このままでは、カスタムなエラーの意味があまりない。だって、どこにも表示されないし。

○エラーを表示する
仕事では、エラーをToolTipに載せて表示した。XAMLの記述できる。
<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tw="http://schemas.tawamuredays.jp/wpf/gui"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="InputErrorStyle" TargetType="TextBox"
BasedOn="{StaticResource {x:Type TextBox}}">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Validation.HasError"
Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip DataContext="{Binding PlacementTarget,
RelativeSource={RelativeSource Self}}">
<StackPanel>
<TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent}"/>
</StackPanel>
</ToolTip>
</Setter.Value>
</Setter>
</MultiTrigger>
</Style.Triggers>
</Style>
<tw:NullableDecimal2StringConverter x:Key="NullableDecimal2StringConverter"/>
</Window.Resources>
<tw:TawamureContents>
<StackPanel>
<TextBox DataContext="{Binding NumericBoxVM}"
tw:FrameworkElementBehavior.UpdatePropertySourceWhenEnterPressed="TextBox.Text"
Style="{StaticResource InputErrorStyle}">
<TextBox.Text>
<Binding Path="InputValue"
Converter="{StaticResource NullableDecimal2StringConverter}">
<Binding.ValidationRules>
<local:DecimalValidationRule IsNullOK="False"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
<tw:TawamureContents.Footer>
<Button Content="終われ!" Command="{Binding CloseCommand}"/>
</tw:TawamureContents.Footer>
</tw:TawamureContents>
</Window>

数値以外を入力してみると、
20120920_1

何かを入力した後で空にしてみると…
20120920_2
メリット:
・エラーを表示するスペースを考慮しなくていい(レイアウト崩れの心配が不要となる)。
デメリット:
・カーソルを持って行かないと内容がわからない。ユーザが一々持って行ってくれるかどうか。

ErrorTemplateもあるんだけど、動作したら載せようっと。

(2013/2/20追記)
数値だけのTextBoxだってやれるはずだ(壱)。も、数値入力専用TextBoxの話になっている。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。