2012-02-24 9 views
12

मैं WPF SQL Connection User Control का उपयोग कर रहा हूं। मुझे स्टैक ओवरव्लो एक्सेप्शन फेंकने के साथ कोई समस्या हो रही है जब भी मेरे पास एक टैब (AvalonDock DocumentTab) है जिसे खोला, बंद कर दिया गया है, और फिर दूसरी बार खोला गया है।डिफ़ॉल्ट मूल्य फेंकने के साथ निर्भरता संपत्ति StackOverflowException

मैंने अपने आवेदन के अनुकूल होने के लिए जेक के मूल कार्यान्वयन के साथ गड़बड़ी की है, लेकिन यह अनिवार्य रूप से वही है। मैंने एक ऐसी संपत्ति जोड़ दी है जो डेटाबेस के चयन को अक्षम करता है।

मैं इस तरह अपने आवेदन में नियंत्रण रखा है:

<controls:SqlConnectionStringBuilder 
     Grid.Row="2" 
     Margin="0,10,0,0" 
     ConnectionString="{Binding ElementName=listBoxClients, 
            Path=SelectedItem.ConnectionString, 
            UpdateSourceTrigger=PropertyChanged}" 
     Header="Connection String" 
     RequireDatabase="True" /> 

मैं आदेश में इस समस्या का निवारण करने में SqlConnectionStringBuilder का कोड-पीछे के कुछ रिफैक्टरिंग किया है, लेकिन यह प्रतीत होता है अपमानजनक कोड:

public static readonly DependencyProperty ConnectionStringProperty = 
    DependencyProperty.Register(
     "ConnectionString", 
     typeof(SqlConnectionString), 
     typeof(SqlConnectionStringBuilder), 
     new FrameworkPropertyMetadata(
      new SqlConnectionString { IntegratedSecurity = true, Pooling = false }, 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

public SqlConnectionString ConnectionString 
{ 
    get { return (SqlConnectionString)GetValue(ConnectionStringProperty); } 
    set { SetValue(ConnectionStringProperty, value); } 
} 

टैब SqlConnectionString वस्तु अपने OnPropertyChanged विधि के साथ अनंत लूप और IntegratedSecurity संपत्ति में हो जाता है की दूसरी खुला पर। जब मैं ConnectionString संपत्ति को निर्भर करता हूं तो निर्भरता प्रॉपर्टी मुझे यह समस्या नहीं मिलती है। मेरे लिए यह कहता है कि समस्या निर्भरता संपत्ति के डिफ़ॉल्ट मूल्य के साथ है।

मैंने यह देखने के लिए ऑनलाइन चारों ओर दबाया कि क्या किसी और के पास यह समस्या है, लेकिन ऐसा लगता है जैसे मैं खुद को एक अचार में प्राप्त कर सकता हूं। एकमात्र चीज करीब है कि मैं सोच सकता हूं कि यह समस्या this SO question about dependency properties which was answered as thread safety के संबंध में हो सकती है। मुझे यकीन नहीं है कि कैसे निर्भरता गुण उनके डिफ़ॉल्ट मानों का इलाज करते हैं, लेकिन मैं देख सकता था कि यदि एक ही ऑब्जेक्ट को OnPropertyChanged ईवेंट के साथ समस्या से दो बार तारित किया गया था। हालांकि यह मुझे विश्वास दिलाता है कि अगर यह मामला कहीं भी देखा गया होता!

कोई विचार?

अतिरिक्त सूचना:
मैं निर्भरता संपत्ति (शून्य पर सेट) के पंजीकरण से डिफ़ॉल्ट मान हटा दिया। यह इस मुद्दे को होने से रोकता है। इस समाधान में एकमात्र कमी यह है कि यूआई null स्थिति में है, कोई डिफ़ॉल्ट चयन नहीं है। हालांकि, इस मुद्दे को हल करके मामला होने से मैं इसे रोकना चाहता हूं।

+1

सुनिश्चित नहीं है कि समस्या क्या है, लेकिन आपको एक डिफ़ॉल्ट मान को एक परिवर्तनीय संदर्भ प्रकार के उदाहरण में सेट नहीं करना चाहिए, क्योंकि ** यह आपके वर्ग के सभी उदाहरण ** द्वारा साझा किया जाएगा! यदि आप कर सकते हैं, तो SqlConnectionString को इसके बजाय एक मान प्रकार बनाएं। * संपादित करें: वास्तव में आप नहीं कर सकते, क्योंकि यह वर्ग आपके कोड में प्रतीत नहीं होता है ...* –

+0

@ थॉमस लेवेस्क मुझे लगता है कि आपने इसे "** ** सभी उदाहरणों से साझा किया जाएगा"। मुझे नहीं पता कि यह संपत्ति परिवर्तनों के अनंत लूप में कैसे पहुंचता है, लेकिन इसे शुरुआती के रूप में पारित मूल्यों के साथ करना है, मैं इसे एक मुद्दा मान सकता हूं। –

उत्तर

0

शायद, सेटर में एक

if (value != GetValue(ConnectionStringProperty)) 

जोड़ने यह बंद हो जाएगा।

2

क्या आप टैब बंद होने से हर बार नई निर्भरता गुण पंजीकृत कर रहे हैं? मुझे पूरा यकीन है कि यदि आप संदर्भित किया गया है तो आप उसी निर्भरता संपत्ति पंजीकरण का पुन: उपयोग नहीं कर सकते हैं। एक बार जब आप टैब बंद कर लेंगे तो कचरा कलेक्टर आपके "कनेक्शनस्ट्रिंग" ऑब्जेक्ट को खाने का प्रयास करेगा। जब टैब स्कोप खो देता है, तो यह सभी बच्चे चर का निपटान करेगा, भले ही वे स्थाई रीडोनली हों।

1

उस अनंत लूप में, ऑनप्रॉपर्टी के जवाब में एकीकृत सुरक्षा संपत्ति को असाइनमेंट कौन कर रहा है? यदि आप पाते हैं कि यह कौन है, तो यह आपके उत्तर की कुंजी है।

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