エラーが解消されてもエラー扱いされ、コントロールの枠が赤くなる場合の対処方法です。
原因
INotifyDataErrorInfoインターフェースのGetErrorsメソッドの戻り値でエラーメッセージのリストを返しますが、エラーがないときに空文字列を返すとエラーが解消されないケースがあります。 イベントの発生順や回数で挙動が変わるので原因が特定しづらいです。対策
エラーがない場合、GetErrorsメソッドでnull(VBの場合Nothing)を返すようにします。GetErrorsメソッドの実装パターンはいろいろありますが、次のサンプルではディクショナリ(_errorMessageDict)に、プロパティ名をキーとしてエラーメッセージが格納されています。
-
C#
public IEnumerable GetErrors(string propertyName) { // 指定されたプロパティで発生しているエラーメッセージを取得 string errorMessage = _errorMessageDict[propertyName]; if (string.IsNullOrEmpty(errorMessage)) { // エラーが無いときは空の文字列ではなく、nullを返す // return nullの行を消すとエラーが戻らなくなる return null; } // エラーメッセージを返す return new string[] { errorMessage }; }
-
VB.NET
Public Function GetErrors(propertyName As String) As IEnumerable Implements INotifyDataErrorInfo.GetErrors ' 指定されたプロパティで発生しているエラーメッセージを取得 Dim errorMessage As String = _errorMessageDict(propertyName) If String.IsNullOrEmpty(errorMessage) Then ' エラーが無いときは空の文字列ではなく、Nothingを返す ' Return Nothingの行を消すとエラーが戻らなくなる Return Nothing End If ' エラーメッセージを返す Return New String() {errorMessage} End Function
サンプルコードのダウンロード
サンプルコードの実行には Microsoft Visual Studio 2015 以上のバージョンが必要です。検証環境
- Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3
- Microsoft .NET Framework Version 4.6.01055
- Microsoft Windows 7 Professional Service Pack 1 (Microsoft Windows NT 6.1 (7601))