2010-11-04 15 views
7

Ich möchte wissen, wie programmgesteuert Validierung über eine DataGridColumn ausgelöst wird. Es wäre ziemlich genau so, wie es ist, die UpdateSource-Methode einer BindingExpression aufzurufen, aber ich kann nicht den BindingExpression der Spalte erhalten.DataGrid-Spaltenüberprüfung erzwingen (WPF)

Danke.

PS: auf der ValidationRule die ValidatesOnTargetUpdated-Eigenschaft ist nicht das, was :)

Antwort

1

In .NET Framework 4, ich suche ein Namespace namens System.ComponentModel.DataAnnotations ist sowohl für die zur Verfügung des gemeinsamen CLR (WPF) und die leichtere Silverlight CLR. Sie können den DataAnnotations-Namespace für verschiedene Zwecke verwenden. Eine davon ist für die Datenvalidierung mithilfe von Attributen und eine weitere ist die visuelle Beschreibung von Feldern, Eigenschaften und Methoden oder zum Anpassen des Datentyps einer bestimmten Eigenschaft. Diese drei Kategorien werden im .NET Framework als Validierungsattribute, Anzeigeattribute und Datenmodellierungsattribute klassifiziert. Dieser Abschnitt verwendet Validierung Attribute Validierungsregeln für Objekte

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

1

@ user424096,

ich keinen Zugriff auf meine Visual Studio-Umgebung haben zu definieren, aber Pseudo-Code folgenden können Sie Ihre gewünschte Art und Weise führen ..

.
  1. eine angebaute boolean Eigenschaft namens NotifySourceUpdates erstellen und heften sich an Datagridcell ist ... ich kann es an Datagrid-Ebene angebracht sind, so dass es auf alle Zellen Datenraster gilt ... können Sie anhängen es auch auf Spaltenebene ...

     <DataGrid ItemsSource="{Binding}"> 
           <DataGrid.CellStyle> 
             <Style TargetType="DataGridCell" > 
               <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/> 
             </Style> 
           </DataGrid.CellStyle> 
         </DataGrid> 
    
  2. Dieses Verhalten angebracht wird das beigefügte Ereignis aufgerufen Binding.SourceUpdated auf Zellebene behandeln. Wenn also eine Bindung als Teil des normalen oder Editiermodus eines untergeordneten UI-Elements aktualisiert wird, wird die Verbindung zur Zellenebene ausgelöst.

     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. In diesem Event-Handler sind die Veranstaltung args vom Typ DataTransferEventArgs Ihnen die Target gibt. Dies wird Ihre Kontrolle sein, die validiert werden muss.

    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. Hier müssen Sie wissen, welcher Wert durch das Steuerelement gültig oder ungültig ist.

    (uiElement.MyValue == null) //// Invalid!! 
    
  5. Wenn Sie wollen, dass die Kontrolle der Bindung zu entkräften, nur den Anruf MarkInvalid Verwenden Sie diese Schritte mit ...

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

Lassen Sie mich wissen, ob das funktioniert ...

Verwandte Themen