2010-11-04 5 views
7

Я хотел бы знать, как программно выполнить проверку валидации над DataGridColumn. Это было бы почти то же самое, что и donde, вызывающий метод UpdateSource для BindingExpression, но мне не удается получить BindingExpression столбца.Проверка правильности столбца DataGrid (WPF)

Спасибо.

PS: установка свойства ValidatesOnTargetUpdated на ValidationRule не то, что я ищу :)

ответ

1

В .NET Framework 4, пространство имен называется System.ComponentModel.DataAnnotations доступна как для общего CLR (WPF) и более легкий Silverlight CLR. Вы можете использовать пространство имен DataAnnotations для различных целей. Один из них - проверка данных с использованием атрибутов, а другая - визуальное описание полей, свойств и методов или настройка типа данных для определенного свойства. Эти три категории классифицируются в .NET Framework как атрибуты проверки, атрибуты отображения и атрибуты моделирования данных. В данном разделе используется проверка атрибутов, чтобы определить правила проверки для объектов

http://www.codeproject.com/KB/dotnet/ValidationDotnetFramework.aspx

1

@ user424096,

У меня нет доступа к моей визуальной среде студии, но следующий псевдокод может направить вас для вашего желаемого пути .. .

  1. Создать приложенный булево свойство NotifySourceUpdates и прикрепить к DataGridCell это ... Я прикрепил его на уровне DataGrid, так что это относится ко всем ячейкам сетки данных ... вы можете прикрепить это на уровне столбцов, а также ...

     <DataGrid ItemsSource="{Binding}"> 
           <DataGrid.CellStyle> 
             <Style TargetType="DataGridCell" > 
               <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/> 
             </Style> 
           </DataGrid.CellStyle> 
         </DataGrid> 
    
  2. Это придает поведение будет обрабатывать прилагаемую мероприятие под названием Binding.SourceUpdated на клеточном уровне. Поэтому всякий раз, когда какой-либо привязка как часть нормального или редактируемого элемента элемента дочернего пользовательского интерфейса обновляется, он загорается и пузырится на уровне ячейки.

     public static readonly DependencyProperty NotifySourceUpdatesProperty 
         = DependencyProperty.RegisterAttached(
          "NotifySourceUpdates", 
          typeof(bool), 
          typeof(MyAttachedBehavior), 
          new FrameworkPropertyMetadata(false, OnNotifySourceUpdates) 
         ); 
    
         public static void SetNotifySourceUpdates(UIElement element, bool value) 
         { 
          element.SetValue(NotifySourceUpdatesProperty, value); 
         } 
    
         public static Boolean GetNotifySourceUpdates(UIElement element) 
         { 
          return (bool)element.GetValue(NotifySourceUpdatesProperty); 
         } 
    
         private static void OnNotifySourceUpdates(DependencyObject d, DependencyPropertyEventArgs e) 
         { 
          if ((bool)e.NewValue) 
          { 
           ((DataGridCell)d).AddHandler(Binding.SourceUpdated, OnSourceUpdatedHandler); 
          } 
         } 
    
  3. В этом обработчике события, арг события имеют DataTransferEventArgs типа, который дает вам TargetObject. Это будет ваш контроль, который необходимо проверить.

    private static void OnSourceUpdatedHandler(object obj, DataTransferEventArgs e) //// Please double check this signature 
    { 
        var uiElement = e.TargetObject as UIElement; 
        if (uiElement != null) 
        { 
         ///... your code to validated uiElement.       
        } 
    } 
    
  4. Здесь вы должны знать, какое значение представлено элементом управления действительным или недействительным.

    (uiElement.MyValue == null) //// Invalid!! 
    
  5. Если вы хотите Контрольного привязки к аннулированию, просто использовать вызов MarkInvalid с помощью этих шагов ...

    ValidationError validationError = 
         new ValidationError(myValidationRule, 
         uiElement.GetBindingExpression(UIElement.MyValueDependecyProperty)); 
    
    validationError.ErrorContent = "Value is empty!"; 
    
    Validation.MarkInvalid(uiElement.GetBindingExpression(UIElement.MyValueDependencyProperty), validationError); 
    

Позвольте мне знать, если это работает ...

Смежные вопросы