23

これはちょっとした WPF の whodunnit です。私の検証テンプルは、期待どおりに表示されません

問題

基本的に、ビュー モデルで IDataErrorInfo を使用して、データ入力エラーに関するフィードバックを提供しています。これが呼び出されて期待どおりに動作していることがわかりますが、バインドされたコントロールの検証エラー テンプレートが WPF によって表示されることはありません。

組み込みのデフォルトのテキストボックスの赤枠エラー テンプレート、スタイル エラー テンプレート、およびハード コーディングされたテンプレートの両方を使用してみました。これらはいずれも、データ エラーの状況では表示されません。

Heres 私の xaml バインディング コード:

<TextBox x:Name="txtCaseNumber"  
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>

奇妙なことに、エラーは Validation.Errors コレクションに入ります。次のコードにより、バインドされたコントロールの横に IDataErrorInfo エラー メッセージが表示されます。これにより、問題はviewmodel側ではなくxaml側にあると思います。

<ContentPresenter 
Content="{Binding ElementName=txtCaseNumber, Path=(Validation.Errors).CurrentItem}" />

さらに、 System.Windows.Controls.Validation.GetHasError(txtCaseNumber)true を返します。

それが違いを生む場合、私はwinformsでWPFをホストしています。私のコードやスタイルで Validation または ErrorTemplate への参照が見つからないので、これがスタイリング自体の目標ではないと確信しています。

4

1 に答える 1

48

それを割った。

ErrorTemplate 添付プロパティは、装飾層を使用して、 IDataErrorInfo を介して報告されたデータ検証エラーに関するエラー テンプレートを表示します。Adorner レイヤーは、すべての状況のすべてのコントロールで常に使用できるわけではありません。コントロールまたはその親の 1 つで、明示的に指定する必要があります。

既定のウィンドウ コントロール テンプレートには、子の装飾層を有効にする AdornerDecorator が含まれています。これが、このウィンドウがデフォルトのコントロール テンプレートを使用していたため、他のウィンドウにエラー テンプレートが正常に表示された理由です。

エラー テンプレートが表示されなかったウィンドウは、ウィンドウに ControlTemplate を提供するスタイルを使用していました。このコントロール テンプレートは を提供していないため<AdornerDecorator>、エラー テンプレートを表示する装飾レイヤーがありません。

修正は、ウィンドウ コントロール テンプレートを でラップするのと同じくらい簡単でした<AdornerDecorator>

于 2010-09-10T14:43:54.347 に答える