これを実装するもう 1 つの方法は、TextBox で読み込まれたイベント ハンドラーでバインディングを設定することです。以下は TextBox の xaml です。
<TextBox Grid.Row="0"
x:Name="txtName"
Text="{Binding Name}"
Loaded="TxtName_OnLoaded" />
TxtName_OnLoaded eventhandler のコード ビハインドでは、新しい Binding オブジェクトが作成され、必要に応じて初期化されます。また、ValidationRule を追加します。
private void TxtName_OnLoaded(object sender, RoutedEventArgs e)
{
ApplicationViewModel appVm = this.DataContext as ApplicationViewModel;
TextBox TxtName = sender as TextBox;
if (TxtName == null)
return;
Binding newBinding = new Binding("Name");
newBinding.ValidatesOnDataErrors = true;
newBinding.ValidatesOnExceptions = true;
newBinding.NotifyOnValidationError = true;
newBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
validator.ErrorMessage = "Labware name should be unique.";
validator.ApplicationViewModel = appVm;
if (!newBinding.ValidationRules.Contains(validator))
newBinding.ValidationRules.Add(validator);
TxtName.SetBinding(TextBox.TextProperty, newBinding);
}
上記の実装でわかるように、新しいバインディング パスで Binding のオブジェクトを作成しました。また、新しく作成された Binding オブジェクトに UpdateSourceTrigger を割り当てます。
バインディングには、複数の検証規則を含めることができます。そこに検証ルールを追加します。これで、バインディングをテキストボックスの TextProperty に設定できます。
利点: xaml では不可能なコード ビハインドから、複数の依存関係オブジェクトを Validation Rule オブジェクトのプロパティにバインドできます。例えば:
これを使用して、TextChanged イベントで入力を検証し、入力を、ApplicationViewModel で Grid にバインドされた public ObservableCollection プロパティとして保存されているアイテムのリストと比較します。ValidationRule のコードは次のとおりです。
public class UniqueValueValidator : ValidationRule
{
public string ErrorMessage { get; set; }
public ApplicationViewModel ApplicationViewModel { get; set; }
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
return null;
var lws = ApplicationViewModel.Inputs.Where(s => s.Name.Equals(value.ToString())).FirstOrDefault();
if (lws != null)
return new ValidationResult(false, ErrorMessage);
return new ValidationResult(true, null);
}
}
上記のコードは、入力を受け取り、"Inputs" オブザーバブル コレクションの可用性をチェックします。値が存在する場合、ルールは false の ValidationResult を返します。この実装を通じて、実行時に入力の一意性をチェックします。
皆さんが楽しんでくれたことを願っています。