最近まで、私はIDataErrorInfo
インターフェースのカスタム拡張バージョンを使用していました。私の拡張機能を使用すると、複数のエラーを同時に処理できます。これまでのところ、非常にうまく機能しています。しかし、INotifyDataErrorInfo
インターフェースが導入されたので、何か改善点があるかどうか試してみようと思いました。
いくつかのオンライン チュートリアルに従った後ValidationAttribute
、System.ComponentModel.DataAnnotations namespace
. これらAttribute
の を使用すると、次のような基本的な検証ルールを提供できます。
[MinLength(3, ErrorMessage = "Name must be longer than 3 characters.")]
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); Validate("Name", name); }
}
Valaidation.Errors
エラーメッセージは、適用された s で利用可能なコレクションに直接プラグインされるため、最初はかなり良いように見えましたErrorTemplate
。ただし、組み込みの検証ルールのほとんどは本当に基本的なものであり、他のプロパティ値を含む複雑な検証ルールを実装する必要があることに慣れています。
そこで、複数のプロパティを含む単純な検証ルールを作成する方法を見つけようと試みました。これは、2 つ以上のフィールドのいずれかを設定する必要があるというルールです。そこで、 を拡張するクラスを宣言し、ValidationAttribute
オンラインで検索した後、他のプロパティ値にアクセスする方法を見つけました。
各 にカスタムErrorTemplate
を適用して基本的な UI を作成し、データ バインド プロパティTextBox
のコレクションを表示しました。Validation.Errors
<ControlTemplate x:Key="ErrorTemplate">
<StackPanel Orientation="Horizontal">
<Border BorderBrush="#4FFF0000" BorderThickness="1" Margin="0,10">
<AdornedElementPlaceholder />
</Border>
<Image Name="WarningImage" Source="pack://application:,,,/WpfApplication1;component/Images/Warning_16.png" Margin="5,0,0,0" Tag="{Binding}" />
<Popup PlacementTarget="{Binding ElementName=WarningImage}" Placement="Right" Margin="5,0,0,0" AllowsTransparency="True" IsOpen="True">
<Border BorderThickness="1" BorderBrush="#4FFF0000" CornerRadius="5" Background="White" Padding="5" Margin="10">
<Border.Effect>
<DropShadowEffect Color="Red" Opacity="0.5" BlurRadius="15" ShadowDepth="0" />
</Border.Effect>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ErrorContent}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Popup>
</StackPanel>
</ControlTemplate>
プロパティのカスタムAttribute
セットを使用して、どちらのプロパティも設定されていないときにインターフェイスを介してコレクションName
に を追加することができましたが、ここに問題があります。他の必要なプロパティにバインドされた他の es データのいずれかに値を追加した場合、最初のエラーメッセージはそこに残ります。ValidationResult
Validation.Errors
TextBox
TextBox
最初に戻ってTextBox
何かを入力すると、検証が機能するため、値を削除しても、必要なプロパティの 1 つが設定されていることがわかりました。したがって、検証コードは機能しますが、問題は、他の必要なプロパティへのプロパティの変更がプロパティの検証をトリガーしないことName
です。
同じカスタムAttribute
を他の必須プロパティに適用した場合でも、同じことが起こりました...各検証エラーは、関連するTextBox
. CustomValidationAttribute
クラス内のメソッドを呼び出して検証できるようにする組み込みも試しましたが、最終結果は同じでした。
検証コードは機能しますが、他の必要なプロパティの変更によってトリガーされません。他のプロパティの名前を渡してメソッドを呼び出してみValidate
ましたが、それは連続ループで終了しました。問題は、別のプロパティが検証されたときに、あるプロパティで検証をトリガーするにはどうすればよいかということです。