मुझे एक कनवर्टर के साथ एक डेटा बाध्यकारी स्थापित किया गया है जो एक अजीब XML स्रोत को एक डिस्प्ले- और संपादन-आंतरिक वर्गों के सुविधाजनक पेड़ को बदलने के लिए है। एक्सएमएल स्रोत से पढ़ने के लिए सबकुछ बढ़िया काम करता है, लेकिन मुझे एक समय का शैतान है जो आंतरिक वर्गों में एक्सएमएल स्रोत पर प्रचार करने के लिए बदलाव करने की कोशिश कर रहा है।कनवर्टर के साथ दो-तरफा डेटा बाध्यकारी स्रोत अपडेट नहीं करता
यहाँ उपयोग साइट के लिए XAML है:
<local:SampleConverter x:Key="SampleConverter" />
<Expander Header="Sample" >
<local:SampleControl
Sample="{Binding Path=XmlSource,
Converter={StaticResource SampleConverter},
Mode=TwoWay}" />
</Expander>
XmlSource एक CLR पढ़ने-लिखने की संपत्ति (नहीं DependencyProperty) बाध्य वस्तु माता पिता डेटा की है। यह एक एक्सएसडी से उत्पन्न एक .NET प्रकार है।
नमूना कनवर्टर IValueConverter
लागू करता है। Convert
विधि को गैर-शून्य डेटा कहा जाता है और लौटाता है, लेकिन ConvertBack
विधि कभी नहीं कहा जाता है।
नमूना नियंत्रण एक उपयोगकर्ता नियंत्रण है जो नमूना डेटा पेड़ के साथ यूआई इंटरैक्शन को समाहित करता है। यह XAML इस तरह दिखता है:
<UserControl x:Class="SampleControl">
[... other stuff ...]
<UserControl.Content>
<Binding Path="Sample" RelativeSource="{RelativeSource Mode=Self}" Mode="TwoWay" TargetNullValue="{StaticResource EmptySampleText}" />
</UserControl.Content>
<UserControl.ContentTemplateSelector>
<local:BoxedItemTemplateSelector />
</UserControl.ContentTemplateSelector>
</UserControl>
नमूना संपत्ति के पीछे SampleControl कोड में एक DependencyProperty है:
public static readonly DependencyProperty SampleProperty =
DependencyProperty.Register("Sample", typeof(SampleType), typeof(SampleControl), new PropertyMetadata(new PropertyChangedCallback(OnSampleChanged)));
public SampleType Sample
{
get { return (SampleType)GetValue(SampleProperty); }
set { SetValue(SampleProperty, value); }
}
private static void OnSampleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null)
{
((INotifyPropertyChanged)e.NewValue).PropertyChanged += ((SampleControl)d).MyPropertyChanged;
}
else if (e.OldValue != null)
{
((INotifyPropertyChanged)e.OldValue).PropertyChanged -= ((SampleControl)d).MyPropertyChanged;
}
}
private void MyPropertyChanged(object sender, PropertyChangedEventArgs e)
{
; // breakpoint here shows change notices are happening
}
कि XmlSource INotifyPropertyChanged लागू करने के लिए बदल जाती है आंतरिक वर्गों, और परिवर्तन सूचनाएं भेज रहे हैं पेड़, जैसा कि ऊपर MyChroperty में एक ब्रेकपॉइंट द्वारा इंगित किया गया है।
तो यदि डेटा रिपोर्ट कर रहा है कि यह बदल गया है, तो डब्ल्यूपीएफ मेरे कनवर्टर की कनवर्टबैक विधि क्यों नहीं बुला रहा है?
संपत्ति बदलाव के लिए आपका कोड नमूना केवल इंगित करता है कि नमूना के गुणों को बदल रहे हैं, नमूना ही नहीं। – Ragepotato
@Ragepotato: आप कह रहे हैं कि डेटा केवल बाध्यकारी अगर एक नया उदाहरण नमूना संपत्ति को सौंपा गया है काम करता है, लेकिन नमूना संपत्ति से जाना जाता मौजूदा उदाहरण के गुणों बदल रहे हैं नहीं तो और INotifyPropertyChanged के माध्यम से अपने परिवर्तन का संकेत? – dthorpe
हां। नमूना कभी नहीं बदला। यह वही वस्तु है। इसके भीतर गुण बदल गए। आप इसका परीक्षण कर सकते हैं। सब कुछ लोड होने के बाद अपने नियंत्रण पर एक बटन डालें और नमूना को आपके वीएम से प्रारंभिक असाइनमेंट मिल जाता है। फिर नमूना को एक नए नमूना टाइप को असाइन करें। याद रखें कि इसे उचित प्रकार होना चाहिए या बाध्यकारी इंजन इसे अनदेखा कर देगा। यदि आप अपना दो रास्ता बाध्यकारी दाएं सेट अप करते हैं, तो आप देखेंगे कि आपका कन्वर्ट बैक कॉल हो जाएगा। – Ragepotato