会社で WPF (.NET Framework 3.5)を利用してアプリを開発していた。
NavigationWindow を用いた SDI で。
Binding を利用し、
DataContext側は IDataErrorInfo と INotifyPropertyChanged を実装し、 XAML側で TextBox のバインド時に ValidatesOnDataErrors を設定していた。
こうしていると、データがエラーであるとすると TextBox が ErrorTemplate のスタイルで指定された表示になる。
(デフォルトは TextBox の場合は枠線が赤くなる。)
当初は default の NavigationWindow で開発していたが
メニューのある先頭へ戻るボタンを追加するために
他の人がカスタムの NavigationWindow の Template に置き換えた。
あるとき、バインドしている TextBox で、
ValidatesOnDataErrors を True にしているにもかかわらず、
エラーがある欄の枠が赤く囲まれないようになっていることに気が付いた。
当初はスタイル設定のミスかとも思ったが全体的におこっていることが判明した。
・・・とすると怪しいのは NavigationWindow の Template 設定のあたり。
実際、Template の設定を外すと元の動きにもどった。
とりあえず、Microsoft の MSDN のサイトから
「カスタム NavigationWindow ユーザー インターフェイスのサンプル」
http://msdn.microsoft.com/ja-jp/library/aa358506(vs.90).aspx
(ショートカット http://bit.ly/9CAtUj )
を取ってきて見てみた。
見比べて、こっちのコードにおかしい点は見当たらない。
というか、このサンプルを参考に作った感じがする。
いろいろ調べているうちに、別のサンプルを見つけた。
「NavigationWindow ControlTemplate の例」
http://msdn.microsoft.com/ja-jp/library/aa970054(vs.90).aspx
(ショートカット http://bit.ly/9EadYQ )
で、こっちのサンプルと比べてみると、先のサンプルとの違いが見つかった。
XAMLで後者は ContentPresenter が AdornerDecorator で囲まれているが、前者は囲まれていなかったのである。
で、開発中のアプリの NavigationWindow の Template の ControlPresenter のところを AdornerDecorator で囲ってみた。
するとエラー時に赤く囲まれるようにもどった。
もう少し調べみたが、AdornerDecorator で囲っていないと、Drag’n Drop も動かなくなるようだ。
http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!187.entry
-------
2010年4月17日追記
MSDN Library が .NET Framework の 4.0 への移行中でリンク先にサンプルファイルが無いので明示的に .NET Framework 3.5 のコンテンツへのリンクするように URL を記述した。
ただし、ここの日記サイトは()の URL を認識しないので、ショートカットも追加
NavigationWindow を用いた SDI で。
Binding を利用し、
DataContext側は IDataErrorInfo と INotifyPropertyChanged を実装し、 XAML側で TextBox のバインド時に ValidatesOnDataErrors を設定していた。
<TextBox Text="{Binding
Path=データ,
ValidatesOnDataErrors=true, ValidatesOnExceptions=true}" />
こうしていると、データがエラーであるとすると TextBox が ErrorTemplate のスタイルで指定された表示になる。
(デフォルトは TextBox の場合は枠線が赤くなる。)
当初は default の NavigationWindow で開発していたが
メニューのある先頭へ戻るボタンを追加するために
他の人がカスタムの NavigationWindow の Template に置き換えた。
あるとき、バインドしている TextBox で、
ValidatesOnDataErrors を True にしているにもかかわらず、
エラーがある欄の枠が赤く囲まれないようになっていることに気が付いた。
当初はスタイル設定のミスかとも思ったが全体的におこっていることが判明した。
・・・とすると怪しいのは NavigationWindow の Template 設定のあたり。
実際、Template の設定を外すと元の動きにもどった。
とりあえず、Microsoft の MSDN のサイトから
「カスタム NavigationWindow ユーザー インターフェイスのサンプル」
http://msdn.microsoft.com/ja-jp/library/aa358506(vs.90).aspx
(ショートカット http://bit.ly/9CAtUj )
を取ってきて見てみた。
見比べて、こっちのコードにおかしい点は見当たらない。
というか、このサンプルを参考に作った感じがする。
いろいろ調べているうちに、別のサンプルを見つけた。
「NavigationWindow ControlTemplate の例」
http://msdn.microsoft.com/ja-jp/library/aa970054(vs.90).aspx
(ショートカット http://bit.ly/9EadYQ )
で、こっちのサンプルと比べてみると、先のサンプルとの違いが見つかった。
XAMLで後者は ContentPresenter が AdornerDecorator で囲まれているが、前者は囲まれていなかったのである。
で、開発中のアプリの NavigationWindow の Template の ControlPresenter のところを AdornerDecorator で囲ってみた。
するとエラー時に赤く囲まれるようにもどった。
もう少し調べみたが、AdornerDecorator で囲っていないと、Drag’n Drop も動かなくなるようだ。
http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!187.entry
-------
2010年4月17日追記
MSDN Library が .NET Framework の 4.0 への移行中でリンク先にサンプルファイルが無いので明示的に .NET Framework 3.5 のコンテンツへのリンクするように URL を記述した。
ただし、ここの日記サイトは()の URL を認識しないので、ショートカットも追加