Докопаться до сообщений об ошибках в контролях SL практически нереально. Единственное, что работает — это принудительный байндинг с exception в сеттере.
Даю свой вариант установки любого графического контроля в режим ошибки:
public static class UX
{
#region Error Property
public static string GetError(DependencyObject obj)
{
return (string)obj.GetValue(ErrorProperty);
}
public static void SetError(DependencyObject obj, string value)
{
obj.SetValue(ErrorProperty, value);
}
static readonly DependencyProperty ErrorFlagProperty = DependencyProperty.RegisterAttached("ErrorFlag", typeof(object), typeof(UX), null);
public static readonly DependencyProperty ErrorProperty = DependencyProperty.RegisterAttached("Error", typeof(string), typeof(UX), new PropertyMetadata(OnErrorChanged));
static void OnErrorChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
var control = obj as Control;
if (control == null) return;
if (args.NewValue == null)
obj.ClearValue(ErrorFlagProperty);
else
{
var binding = new Binding("Error")
{
Mode = BindingMode.TwoWay,
NotifyOnValidationError = true,
ValidatesOnExceptions = true,
UpdateSourceTrigger = UpdateSourceTrigger.Explicit,
Source = new ErrorMessage((string)args.NewValue)
};
BindingOperations.SetBinding(obj, ErrorFlagProperty, binding);
control.GetBindingExpression(ErrorFlagProperty).UpdateSource();
}
}
public class ErrorMessage
{
readonly string _error;
public ErrorMessage(string error)
{
_error = error;
}
public string Error
{
get
{
return _error;
}
set
{
throw new Exception(_error);
}
}
}
#endregion
}
Работает так:
UX.SetError(_myEditBox, "Товарищи! Не забываем вводить парол");