2010-11-04 23 views
7

DataGridColumn üzerinden doğrulamayı nasıl programlayacağımızı bilmek istiyorum. Bir BindingExpression'ın UpdateSource yöntemini çağırmak donde olduğu gibi hemen hemen aynı olurdu, ancak sütunun BindingExpression'u elde edemiyorum.Force DataGrid sütun doğrulaması (WPF)

Teşekkürler.

PS: ValidationRule üzerine ValidatesOnTargetUpdated özelliğini ayarlayarak Ben .NET Framework 4'te :)

cevap

1

arıyorum ne değildir, bir ad alanı denilen System.ComponentModel.DataAnnotations ortak CLR ikisi için kullanılabilir (WPF) ve daha hafif Silverlight CLR. DataAnnotation ad alanını çeşitli amaçlarla kullanabilirsiniz. Bunlardan biri, öznitelikler kullanılarak veri doğrulaması, diğeri ise alanların, özelliklerin ve yöntemlerin görsel açıklaması veya belirli bir özelliğin veri türünü özelleştirmektir. Bu üç kategori, Doğrulama Öznitelikleri, Görüntü Nitelikleri ve Veri Modelleme Nitelikleri olarak .NET Framework'te sınıflandırılır. Bu bölüm

benim görsel stüdyo ortamında erişimi yok, Doğrulama nesneleri

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

1

user424096 @ için doğrulama kuralları tanımlamak için Nitelikler kullanır, ancak sözde kod aşağıdaki istediğiniz yol için size rehberlik edebilir .. .

  1. iliştirilmiş bir boole özelliği denir NotifySourceUpdates oluşturun ve tüm veri ızgara hücreleri uygulanacak şekilde DataGridCell için ... Ben datagrid düzeyinde boyutu ele alınmıştır olduğunu takmak ... sen ekleyebilirsiniz yanı sütun düzeyinde o ...

     <DataGrid ItemsSource="{Binding}"> 
           <DataGrid.CellStyle> 
             <Style TargetType="DataGridCell" > 
               <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/> 
             </Style> 
           </DataGrid.CellStyle> 
         </DataGrid> 
    
  2. Bu ekli davranış hücre düzeyinde Binding.SourceUpdated denilen ekli etkinliği işleyecek. Dolayısıyla, herhangi bir alt UI öğesinin normal veya düzenleme modunun bir parçası olarak herhangi bir bağlamanın kaynağı güncellendiğinde, ateşlenecek ve hücre düzeyine gelecektir. Bu olay işleyicisi

     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. , olay args size TargetObject verir tip DataTransferEventArgs vardır. Bu, doğrulanması gereken kontrolünüz olacak.

    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. Burada kontrol geçerli veya geçersiz tarafından temsil hangi değeri bilmesi gerekir.

    (uiElement.MyValue == null) //// Invalid!! 
    
  5. İsterseniz kontrol sitesinin ...

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

Bu çalışırsa bana bildirin ... adımları kullanarak MarkInvalid çağrı kullanmak geçersiz bağlanma