これは、私が以前に尋ねた質問に対するフォローアップの質問です。
WPF - ValidationRule が呼び出されていません
そこで実装するように言われたINotifyDataErrorInfo
ので、実装しましたが、まだ機能しません。
xaml は次のとおりです。
<TextBlock VerticalAlignment="Center">
<TextBlock.Text>
<Binding Path="Path" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<viewModel:StrRule/>
</Binding.ValidationRules>
</Binding>
</TextBlock.Text>
</TextBlock>
ビューモデルで:
private string _path;
public string Path
{
set
{
_path = value;
OnPropertyChange("Path");
}
get { return _path; }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChange(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private Dictionary<String, List<String>> errors = new Dictionary<string, List<string>>();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
private void SetErrors(string propertyName, List<string> propertyErrors)
{
// Clear any errors that already exist for this property.
errors.Remove(propertyName);
// Add the list collection for the specified property.
errors.Add(propertyName, propertyErrors);
// Raise the error-notification event.
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
private void ClearErrors(string propertyName)
{
// Remove the error list for this property.
errors.Remove(propertyName);
// Raise the error-notification event.
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
{
// Provide all the error collections.
return (errors.Values);
}
else
{
// Provice the error collection for the requested property
// (if it has errors).
if (errors.ContainsKey(propertyName))
{
return (errors[propertyName]);
}
else
{
return null;
}
}
}
public bool HasErrors
{
get
{
return errors.Count > 0;
}
}
そして検証ルール:
public class StrRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
string filePath = String.Empty;
filePath = (string)value;
if (String.IsNullOrEmpty(filePath))
{
return new ValidationResult(false, "Must give a path");
}
if (!File.Exists(filePath))
{
return new ValidationResult(false, "File not found");
}
return new ValidationResult(true, null);
}
}
FileDialog を開いて ViewModel の Path プロパティを更新するボタンも表示されます。
TextBlock が更新されると、バインディング自体が機能し、set プロパティが呼び出されますが、検証規則自体は呼び出されません。ここで何が欠けている/間違っていますか?