2010-11-04 15 views
7

मैं जानना चाहता हूं कि डेटाग्रिड कॉलम पर प्रोग्रामेटिक रूप से सत्यापन कैसे करें। यह काफी समान होगा क्योंकि यह एक बाध्यकारी एक्सप्रेशन के अपडेटसोर्स विधि को कॉल करने वाला डोंडे है, लेकिन मैं कॉलम के बाइंडिंग एक्सप्रेशन को प्रबंधित नहीं कर सकता।फोर्स डेटाग्रिड कॉलम सत्यापन (डब्ल्यूपीएफ)

धन्यवाद।

पुनश्च: ValidationRule पर ValidatesOnTargetUpdated संपत्ति की स्थापना नहीं है मैं :)

उत्तर

1

के लिए क्या देख रहा हूँ .NET फ्रेमवर्क 4 में, एक नाम स्थान कहा जाता System.ComponentModel.DataAnnotations दोनों आम CLR के लिए उपलब्ध है (डब्ल्यूपीएफ) और लाइटर सिल्वरलाइट सीएलआर। आप विभिन्न उद्देश्यों के लिए डेटाअनोटेशन नेमस्पेस का उपयोग कर सकते हैं। इनमें से एक विशेषता का उपयोग कर डेटा सत्यापन के लिए है, और दूसरा फ़ील्ड, गुण, और विधियों का दृश्य वर्णन है, या एक विशिष्ट संपत्ति के डेटा प्रकार को अनुकूलित करने के लिए है। इन तीन श्रेणियों को .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. इस ईवेंट हैंडलर में, घटना args प्रकार 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); 
    

मुझे पता है कि अगर यह काम करता है ... बाध्यकारी

संबंधित मुद्दे