2010-11-04 36 views
7

Tôi muốn biết cách lập trình để xác nhận hợp lệ qua DataGridColumn. Nó sẽ được khá nhiều giống như nó là donde gọi phương pháp UpdateSource của một BindingExpression, nhưng tôi không thể quản lý để có được BindingExpression của cột.Buộc xác thực cột DataGrid (WPF)

Cảm ơn.

PS: thiết lập thuộc tính trên ValidationRule ValidatesOnTargetUpdated không phải là những gì tôi đang tìm kiếm :)

Trả lời

1

Trong .NET Framework 4, một không gian tên gọi là System.ComponentModel.DataAnnotations có sẵn cho cả CLR chung (WPF) và CLR Silverlight nhẹ hơn. Bạn có thể sử dụng không gian tên DataAnnotations cho các mục đích khác nhau. Một trong số này là để xác thực dữ liệu bằng cách sử dụng các thuộc tính và một là mô tả trực quan về các trường, thuộc tính và phương thức hoặc để tùy chỉnh kiểu dữ liệu của một thuộc tính cụ thể. Ba loại này được phân loại trong Khuôn khổ .NET dưới dạng Thuộc tính xác thực, Thuộc tính hiển thị và Thuộc tính mô hình hóa dữ liệu. Phần này sử dụng Validation thuộc tính để xác định quy tắc xác nhận cho các đối tượng

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

1

@ user424096,

Tôi không có quyền truy cập vào môi trường visual studio của tôi, nhưng sau mã giả có thể hướng dẫn bạn cho cách bạn mong muốn .. .

  1. Tạo một tài sản gắn liền boolean gọi NotifySourceUpdates và đính kèm là để DataGridCell ... tôi có kèm theo nó ở mức DataGrid để nó áp dụng cho tất cả các ô lưới dữ liệu ... bạn có thể đính kèm nó ở mức cột cũng ...

     <DataGrid ItemsSource="{Binding}"> 
           <DataGrid.CellStyle> 
             <Style TargetType="DataGridCell" > 
               <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/> 
             </Style> 
           </DataGrid.CellStyle> 
         </DataGrid> 
    
  2. hành vi gắn liền này sẽ xử lý các sự kiện gắn liền gọi Binding.SourceUpdated ở cấp tế bào. Vì vậy, bất cứ khi nào bất kỳ ràng buộc nào như là một phần của chế độ bình thường hoặc chỉnh sửa của phần tử giao diện người dùng nào có nguồn cập nhật thì phần tử đó sẽ kích hoạt và bong bóng đến mức ô.

     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. Trong xử lý sự kiện này, sự kiện args thuộc loại DataTransferEventArgs cung cấp cho bạn TargetObject. Đây sẽ là kiểm soát của bạn mà cần phải xác nhận.

    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. Ở đây bạn phải biết giá trị nào được biểu thị bằng điều khiển là hợp lệ hoặc không hợp lệ.

    (uiElement.MyValue == null) //// Invalid!! 
    
  5. Nếu bạn muốn kiểm soát của ràng buộc để làm mất hiệu lực, chỉ cần sử dụng cuộc gọi MarkInvalid sử dụng các bước sau ...

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

Hãy cho tôi biết nếu làm việc này ...

Các vấn đề liên quan