タイトルからも分かると思いますが、今まで何度も質問されてきたことを質問します。しかし、これらの他の質問をすべて読んだ後でも、私の問題に対する適切な解決策を見つけることができません。
基本的な検証を行うモデル クラスがあります。
partial class Player : IDataErrorInfo
{
public bool CanSave { get; set; }
public string this[string columnName]
{
get
{
string result = null;
if (columnName == "Firstname")
{
if (String.IsNullOrWhiteSpace(Firstname))
{
result = "Geef een voornaam in";
}
}
if (columnName == "Lastname")
{
if (String.IsNullOrWhiteSpace(Lastname))
{
result = "Geef een familienaam in";
}
}
if (columnName == "Email")
{
try
{
MailAddress email = new MailAddress(Email);
}
catch (FormatException)
{
result = "Geef een geldig e-mailadres in";
}
}
if (columnName == "Birthdate")
{
if (Birthdate.Value.Date >= DateTime.Now.Date)
{
result = "Geef een geldige geboortedatum in";
}
}
CanSave = true; // this line is wrong
return result;
}
}
public string Error { get { throw new NotImplementedException();} }
}
この検証は、プロパティが変更されるたびに (つまり、ユーザーがテキスト ボックスに文字を入力するたびに) 行われます。
<TextBox Text="{Binding CurrentPlayer.Firstname, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="137" IsEnabled="{Binding Editing}" Grid.Row="1"/>
これは完璧に機能します。検証がPropertyChanged
行われます (バインディングのコードは、Player のオブジェクトである CurrentPlayer プロパティの VM で実行されます)。
私が今やりたいことは、検証が失敗したときに保存ボタンを無効にすることです。
まず、最も簡単な解決策がこのスレッドにあるようです:
IDataErrorInfo を使用して検証中に保存ボタンを無効にする
- 受け入れられた解決策に従いたい場合は、単純にインデクサーを使用できないため、検証コードを 2 回記述する必要があります。ダブルコードを書くことは私が望んでいることではないので、それは私の問題の解決策ではありません。
- そのスレッドの 2 番目の回答は、最初の回答と同様に非常に有望に思えましたが、問題は、検証が必要なフィールドが複数あることです。そうすれば、すべてが最後にチェックされたプロパティに依存します (したがって、そのフィールドが正しく入力されていれば、
CanSave
まだ無効な他のフィールドがあっても true になります)。
私が見つけたもう 1 つの解決策は、ErrorCount
プロパティを使用することです。しかし、私はプロパティの変更ごとに (そして入力された文字ごとに) 検証しているので、これも不可能ErrorCount
です。
この問題を解決する最善の方法は何でしょうか?
ありがとう