Re[2]: Silverlight 4 Validator. Рюшечки
От: demigor  
Дата: 28.11.11 17:11
Оценка:
Докопаться до сообщений об ошибках в контролях 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, "Товарищи! Не забываем вводить парол");
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.