इन कोड में क्या गलत है, जब मैं और NotifyOnValidationError प्रॉपर्टी को True पर सेट करता हूं, तो Validation.Error को कभी भी सक्रिय नहीं किया जाता है। तो, विधि "ग्रिड_एरर (ऑब्जेक्ट प्रेषक, ValidationErrorEventArgs e)" कभी निष्पादित नहीं होती है, लेकिन मुझे नहीं पता क्यों :(

<Window xmlns:my="clr-namespace:WpfDigitalClock;assembly=WpfDigitalClock"  x:Class="WpfApplication1.MainWindow"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:Names x:Key="MyNames" />
</Window.Resources>
<Grid Validation.Error="Grid_Error">
    <TextBox Height="21" Margin="12,62,0,0" Name="TextBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120">
        <TextBox.Text>
            <Binding Source="{StaticResource MyNames}" Path="FirstName" NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <local:StringValidator />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBox Height="21" HorizontalAlignment="Right" Margin="0,62,12,0" Name="TextBox2" VerticalAlignment="Top" Width="120" >
        <TextBox.Text>
            <Binding Source="{StaticResource MyNames}" Path="LastName" NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <local:StringValidator />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <Button HorizontalAlignment="Left" Margin="35,122,0,116" Name="Button1" Width="75" Click="Button1_Click">Back</Button>
    <Button HorizontalAlignment="Right" Margin="0,122,34,117" Name="Button2" Width="75" Click="Button2_Click">Forward</Button>
    <Button Height="22" Margin="101,0,101,56" Name="Button3" VerticalAlignment="Bottom" Click="Button3_Click">Add</Button>
</Grid>

Window1.xaml.cs फ़ाइल में:

public class StringValidator : ValidationRule
{
    public override ValidationResult Validate(object value,
       System.Globalization.CultureInfo cultureinfo)
    {
        string aString = value.ToString();
        if (aString == "")
            return new ValidationResult(false, "String cannot be null");
        return new ValidationResult(true, null);
    }
}

private void Grid_Error(object sender, ValidationErrorEventArgs e)
{
    if(e.Action == ValidationErrorEventAction.Added) 
        MessageBox.Show(e.Error.ErrorContent.ToString());
}

आपके सहयोग के लिए धन्यवाद !

संपादित करें:

यहाँ मेरे नाम वर्ग:

class Names : ObservableCollection<Name>
{
    public Names ()
    {
        Name aName = new Name("FirstName " + (this.Count +1).ToString(),
            "LastName " + (this.Count + 1).ToString());

        this.Add(aName);
    }
}

यहाँ मेरा नाम वर्ग:

class Name : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _firstName;
    private string _lastName;


    public Name(string fName,  string lName)
    {
        _firstName = fName;
        _lastName = lName;
    }

    public string FirstName 
    { 
        get
        {
            return _firstName;
        }
        set
        {
            _firstName = value; 
            PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
        }
    }
    public string LastName 
    {
        get
        {
            return _lastName;
        }
        set
        {
            _lastName = value; 
            PropertyChanged(this, new PropertyChangedEventArgs("LastName"));
        }
    }
}
wpf
0
Florian 3 मई 2011, 12:35
क्या टेक्स्टबॉक्स एक त्रुटि प्रदर्शित करते हैं (डिफ़ॉल्ट रूप से लाल सीमा)?
 – 
H.B.
3 मई 2011, 12:47
आपने इसे कैसे ठीक किया?
 – 
DasDas
18 मई 2015, 17:20

3 जवाब

सबसे बढ़िया उत्तर

आपकी टिप्पणी से मैं यह निष्कर्ष निकालूंगा कि सत्यापन नियम कोई त्रुटि नहीं लौटाता है, इसलिए त्रुटि घटना को निकाल नहीं दिया जाता है। डीबगर के साथ सत्यापन-विधि के माध्यम से कदम उठाने का प्रयास करें।

साथ ही, सत्यापन केवल स्रोत-अद्यतन पर किया जाता है, टेक्स्टबॉक्स में जो सामान्य रूप से LostFocus पर होता है।

संपादित करें: MyNames एक संग्रह है, इसमें वे गुण नहीं हैं जिनसे आप आबद्ध होने का प्रयास करते हैं, आउटपुट विंडो में बाध्यकारी त्रुटियां होनी चाहिए।

यदि आप पहले तत्व से जुड़ना चाहते हैं तो आपको अंतिम-नाम-बाध्यकारी के लिए पथ को [0].LastName जैसे कुछ में बदलना होगा।

2
H.B. 3 मई 2011, 17:11
जब मैं अपने स्ट्रिंग वैलिडेटर क्लास की मान्य विधि में ब्रेकपॉइंट डालता हूं, तो ब्रेकपॉइंट कभी नहीं पहुंचता है।
 – 
Florian
3 मई 2011, 13:18
1
सत्यापन केवल स्रोत-अद्यतन पर किया जाता है, टेक्स्टबॉक्स में जो सामान्य रूप से LostFocus पर होता है। क्या आपने टेक्स्टबॉक्स संपादित किया और कहीं और क्लिक किया?
 – 
H.B.
3 मई 2011, 13:29
हां, मैं "टेक्स्टबॉक्स 1" और "टेक्स्टबॉक्स 2" नामक 2 टेक्स्टबॉक्स की टेक्स्ट प्रॉपर्टी भरता हूं, फिर मैं "बटन 3" नामक बटन पर क्लिक करता हूं
 – 
Florian
3 मई 2011, 13:36
वास्तव में तुम सही हो! खोया फोकस उठाया जाना चाहिए !!! अन्यथा सत्यापन नहीं कहा जाता है।
 – 
Florian
3 मई 2011, 13:57
जाहिरा तौर पर TextChanged को भी उठाया जाना चाहिए
 – 
Florian
3 मई 2011, 13:59

एप्लिकेशन इस संग्रह की सामग्री को संशोधित नहीं कर सकता है। इस संलग्न संपत्ति का उपयोग कैसे करें, इसके उदाहरण के लिए उदाहरण अनुभाग देखें।

WPF डेटा बाइंडिंग मॉडल आपको ValidationRules को अपने बाइंडिंग ऑब्जेक्ट से संबद्ध करने में सक्षम बनाता है। कनवर्टर को बुलाए जाने से पहले लक्ष्य-से-बाध्यकारी स्रोत मूल्य हस्तांतरण के दौरान सत्यापन होता है। निम्नलिखित सत्यापन प्रक्रिया का वर्णन करता है:

1. जब लक्ष्य संपत्ति से स्रोत संपत्ति में एक मूल्य स्थानांतरित किया जा रहा है, तो डेटा बाध्यकारी इंजन पहले किसी भी सत्यापन त्रुटि को हटा देता है जो सत्यापन में जोड़ा जा सकता है। बाध्य तत्व की त्रुटि संलग्न संपत्ति। यह तब जांचता है कि क्या उस बाध्यकारी के लिए परिभाषित कोई कस्टम सत्यापन नियम हैं, इस मामले में यह प्रत्येक सत्यापन नियमों पर मान्य विधि को तब तक कॉल करता है जब तक कि उनमें से कोई एक त्रुटि में न चला जाए या जब तक वे सभी पास न हो जाएं।

2. एक बार एक कस्टम नियम है जो पास नहीं होता है, बाध्यकारी इंजन एक ValidationError ऑब्जेक्ट बनाता है और इसे Validation.Errors बाउंड एलिमेंट के संग्रह में जोड़ता है। जब Validation.Errors खाली नहीं होता है, तो Validation.HasError संलग्न गुण का तत्व सत्य पर सेट होता है। साथ ही, अगर बाइंडिंग की NotifyOnValidationError प्रॉपर्टी को सही पर सेट किया जाता है, तो बाइंडिंग इंजन Validation.Error अटैचमेंट इवेंट को एलिमेंट में बढ़ा देता है।

3.यदि सभी नियम पारित हो जाते हैं, तो बाध्यकारी इंजन मौजूद होने पर कनवर्टर को कॉल करता है।

4. यदि कनवर्टर गुजरता है, तो बाध्यकारी इंजन स्रोत संपत्ति के सेटर को कॉल करता है।

5.यदि बाइंडिंग के साथ एक ExceptionValidationRule संबद्ध है और चरण 4 के दौरान एक अपवाद फेंका जाता है, तो बाइंडिंग इंजन यह देखने के लिए जाँच करता है कि क्या कोई UpdateSourceExceptionFilter है। अपवादों को संभालने के लिए कस्टम हैंडलर प्रदान करने के लिए आपके पास UpdateSourceExceptionFilter कॉलबैक का उपयोग करने का विकल्प है। यदि बाइंडिंग पर UpdateSourceExceptionFilter निर्दिष्ट नहीं है, तो बाइंडिंग इंजन अपवाद के साथ एक ValidationError बनाता है और इसे Validation.Errors बाउंड एलिमेंट के संग्रह में जोड़ता है।

यह भी ध्यान दें कि किसी भी दिशा में एक वैध मूल्य हस्तांतरण (लक्ष्य-से-स्रोत या स्रोत-से-लक्ष्य) सत्यापन को साफ़ करता है। संलग्न संपत्ति में त्रुटियां।

मल्टीबाइंडिंग परिदृश्यों में इस गुण के व्यवहार के बारे में जानकारी के लिए, ValidationError देखें।

3
Hemant 2 अप्रैल 2012, 16:23

क्या आपका नाम वर्ग INotifyPropertyChanged लागू करता है?

फ़ाइल के कोड-बैक फ़ाइल में, अपने डेटाकॉन्टेक्स्ट को this पर सेट करें। अपनी Names वस्तु को वहां एक संपत्ति के रूप में बेनकाब करें और देखें कि क्या यह काम करती है। मैं खिड़की में स्थिर संसाधन के लिए बाध्य होने में सहज नहीं हूं।

0
Andre Luus 3 मई 2011, 13:06