<C#_CLR側>
using System.Windows.Controls;
namespace WpfApplication8
{
class TestRule: ValidationRule
{
/// <summary>
/// 値のルールを設定する
/// 実装する必要のある抽象クラスはひとつ。ふさわしい値であった場合、ValidationResultオブジェクトにtrueをセットして返す
/// 不正な場合はfalseとメッセージを返す
/// </summary>
/// <param name="value"></param>
/// <param name="cultureInfo"></param>
/// <returns></returns>
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
double result;
if (!double.TryParse(value as string, out result))
return new ValidationResult(false, "文字列が不正");
if (result < 0 || result > 360)
return new ValidationResult(false, "値の範囲が不正");
return new ValidationResult(true, null);
}
}
}
------------------------------------------------------------------------------------------------------------------
<WPF_XAML側>
<Window x:Class="WpfApplication8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:WpfApplication8"
Title="MainWindow" Height="350" Width="525">
<WrapPanel>
<Slider Width="300" Name="Slider1" Minimum="0" Maximum="360"></Slider>
<TextBox>
<Binding ElementName="Slider1" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Path="Value" >
<Binding.ValidationRules>
<src:TestRule/>
</Binding.ValidationRules>
</Binding>
</TextBox>
</WrapPanel>
</Window>
<バインディング入力の際の注意点>
プロパティウインドウ内で入力した値はアトリビュートシンタックスでXAMLに出力される。
Binding構文は一つのエレメントに対してひとつだけしか指定できないので結果、強制的に
<Binding.ValidationRules>を利用したい場合、プロパティエレメントシンタックスで書く必要がある
(???どうしてこんな仕様なのか謎。ValidationRulesのアトリビュートシンタックスが存在しない)
その為、構文は上記のようになる。その場合、手作業で書きなおしをする必要があるので注意
*複雑な構文は最初からプロパティエレメントシンタックスで書く癖をつけると良い
最終更新:2012年09月26日 14:55