में सत्यापन त्रुटियां मेरे पास एक UserControl है जिसे हम विकसित किए जा रहे एक एप्लिकेशन में पुन: उपयोग किया जाएगा। हम एमवीवीएमलाइट के आधार पर एक ढांचा का उपयोग कर रहे हैं।एमवीवीएम और डेटा एन्नोटेशन के साथ डब्ल्यूपीएफ, उपयोगकर्ता नियंत्रण
सरलता के लिए कहते हैं कि उपयोगकर्ता नियंत्रण केवल एक पाठ बॉक्स होता है और एक निर्भरता संपत्ति "मात्रा" नाम को उजागर करता है की सुविधा देता है। उपयोगकर्ता नियंत्रण पर टेक्स्टबॉक्स निर्भरता संपत्ति "मात्रा" के लिए डेटाबेस है।
जब उपयोगकर्ता नियंत्रण के लिए एक दृश्य पर प्रयोग किया जाता है, usercontrol की "मात्रा" निर्भरता संपत्ति एक ViewModel में एक संपत्ति के लिए डेटाबाउंड है। (यह व्यूमोडेल एमवीवीएमएलएट व्यू मॉडेल लोकेटर के माध्यम से हमारे विचार का डाटाकॉन्टेक्स्ट है)।
यह सब बढ़िया काम करता है! बाइंडिंग काम करते हैं, गुण सेट होते हैं जैसे मैं उम्मीद करता हूं। सब ठीक है जब तक यह सत्यापन की बात आती है।
हम अपने ViewModel गुणों को सजाने के लिए DataAnnotations का उपयोग कर रहे हैं। ViewModel में INotifyDataErrorInfo का एक कस्टम कार्यान्वयन है। हमने नियंत्रण के चारों ओर एक लाल सीमा दिखाने के लिए अधिकांश इनपुट नियंत्रणों के लिए कस्टम शैलियों को लागू किया है, और सत्यापन त्रुटि संदेश प्रदर्शित करने वाले नियंत्रण के बगल में एक संदेश है। यह सब एक सामान्य मामले में महान काम करता है (उदाहरण के लिए एक दृश्य मॉडल में किसी संपत्ति के लिए एक दृश्य पर टेक्स्टबॉक्स)।
जब मैं इस उपयोगकर्ता नियंत्रण, जो मैं के साथ अंत का उपयोग कर एक ही दृष्टिकोण का प्रयास पूरे उपयोगकर्ता नियंत्रण और वास्तविक पाठ बॉक्स पर कोई त्रुटि संकेत चारों ओर एक लाल बॉर्डर है। ऐसा लगता है कि यूआई में एक त्रुटि है कि एक त्रुटि है, लेकिन यह सिर्फ उस नियंत्रण को नहीं बना रहा है जिसे मैं चाहता हूं।
मैं समाधान के साथ उन सवालों का, इस समस्या के लिए stackoverflow पर खोज की है, कोई भी मेरी स्थिति के लिए काम करने के लिए लग रहे हैं।
मेरा पहला अनुमान है कि क्योंकि वास्तविक पाठ बॉक्स मेरे विचार मॉडल पर निर्भरता संपत्ति ही है और नहीं संपत्ति को सीधे ही है, तो इसे जनरेट त्रुटियों की ठीक से अधिसूचित नहीं किया जा रहा है। क्या उपयोगकर्ता नियंत्रण के माध्यम से और फिर टेक्स्टबॉक्स में व्यूमोडेल में उत्पन्न त्रुटियों को प्रसारित करने का कोई तरीका है?
कोई भी मदद या सुझाव जो आप दे सकते हैं, बहुत अच्छा होगा।
यहां UserControl xaml है।
<UserControl x:Class="SampleProject.UserControls.SampleControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" x:Name="sampleControl"
d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="LayoutRoot" DataContext="{Binding ElementName=sampleControl}">
<TextBox Text="{Binding Path=Quantity, ValidatesOnDataErrors=True}" Width="100" Height="30" />
</Grid>
</UserControl>
उपयोगकर्ता नियंत्रण कोड पीछे।
public partial class SampleControl : UserControl
{
public SampleControl()
{
InitializeComponent();
}
public static readonly DependencyProperty QuantityProperty =
DependencyProperty.Register("Quantity", typeof(int?), typeof(SampleControl),
new FrameworkPropertyMetadata{DefaultValue=null, BindsTwoWayByDefault = true});
public int? Quantity
{
get { return (int?)GetValue(QuantityProperty); }
set { SetValue(QuantityProperty, value); }
}
}
एक दृश्य पर प्रयुक्त।
<userControls:SampleControl Grid.Row="1" Quantity="{Binding Path=Quantity, ValidatesOnDataErrors=True}" Height="60" Width="300"/>
व्यूमोडेल संपत्ति।
[Required(ErrorMessage = "Is Required")]
[Range(5, 10, ErrorMessage = "Must be greater than 5")]
public int? Quantity
{
get { return _quantity; }
set { Set(() => Quantity, ref _quantity, value); }
}
private int? _quantity;
(* नोट, सेटर में सेट विधि आधार viewmodel कि समर्थन संपत्ति सेट करता है और इसके लिए PropertyChanged घटना उठाती में सिर्फ एक सहायक विधि है।)
जब कोड काम कर रहा है, तो त्रुटि संदेश उसी टेक्स्टबॉक्स पर दिखाई देता है? – Tico
हां। यदि वह टेक्स्टबॉक्स स्वयं दृश्य पर था और सीधे ViewModel पर मात्रा गुण पर बाध्य था तो सत्यापन त्रुटि टेक्स्टबॉक्स पर दिखाई देती है। लेकिन जब टेक्स्टबॉक्स उपयोगकर्ता नियंत्रण में होता है और बाध्यकारी उपयोगकर्ता नियंत्रण की निर्भरता संपत्ति के माध्यम से जाता है, तो सत्यापन त्रुटि खो जाती है। – thornhill
भले ही आप ब्रेकपॉइंट डाल दें? – Tico