2012-02-24 14 views
12

WPF SQL Connection User Control kullanıyorum. Açılmış, kapatılmış ve sonra ikinci kez açılmış bir sekmede (AvalonDock DocumentTab) varsa, StackOverflowException atma ile ilgili bir sorun yaşıyorum.Varsayılan Değerle Bağımlılık Varlığı Atma StackOverflowException

Uygulamamıza daha iyi uyacak şekilde Jake'in temel uygulamasıyla uğraştım ama aslında aynı. Veritabanının seçimini devre dışı bırakan bir özellik ekledim. Bu sorunu gidermek amacıyla

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

Ben SqlConnectionStringBuilder kod-arkasına bazı üstlenmeden yaptık, ama bu gibi görünüyor:

Bu gibi benim uygulamasına kontrolünü yerleştirdiğiniz soruna kodu: SqlConnectionString nesnenin OnPropertyChanged yöntemi ile bir sonsuz döngü ve IntegratedSecurity özelliği içine alır sekme ikinci açık üzerinde

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); } 
} 

. Ben ConnectionString özelliği yaptığınızda bir DependencyProperty değil, bu sorunla karşılaşıyorum. Bana göre bu, sorunun bağımlılık özelliğinin varsayılan değeriyle olduğunu söylüyor.

Başka birinin bu sorunu yaşayıp yaşamadığını görmek için çevrimi araştırdım, ama sanki kendimi biraz turne almış olabilirmişim gibi görünüyor. Bu sorunun olabileceğini aklıma gelen tek şey, this SO question about dependency properties which was answered as thread safety ile ilgilidir. Bağımlılık özelliklerinin varsayılan değerlerini nasıl ele aldığından emin değilim, ancak aynı nesnenin OnPropertyChanged olayı ile iki kat daha fazla sorunla karşılaştığını görebiliyordum. Ancak bu aynı zamanda, eğer durum buysa, bu sorunun bir yere not edildiğine inanmamı da beraberinde getirdi!

Herhangi bir düşünce?

Bilgi Ek:
Ben bağımlılık özelliği (boş olarak ayarlayın) tescili Varsayılan değeri kaldırıldı. Bu, sorunun oluşmasını engeller. Bu çözümün tek dezavantajı, UI'nin bir null durumunda olması, varsayılan seçimlerin olmamasıdır. Bununla birlikte, sorunu çözerek durumdan kaçınmak isterim. setter bir

if (value != GetValue(ConnectionStringProperty)) 

ekleyerek Muhtemelen

+1

Sorunun ne olduğundan emin değilsiniz, ancak varsayılan değeri değişken bir referans türünün örneğine ayarlamamanız gerekir; çünkü **, sınıfınızın ** tüm örnekleri tarafından paylaşılacaktır! Yapabilirseniz, SqlConnectionString yerine bir değer yazın. * EDIT: Aslında yapamazsın, çünkü bu sınıf kendi kodunda görünmüyor ...* –

+0

@ThomasLevesque "** Tüm örnekler ** tarafından paylaşılacak" ile çivilenmiş olduğunu düşünüyorum. Mülkiyet değişikliklerinin sonsuz döngüsüne nasıl girdiğimi bilmiyorum, ama bunun bir sorun olduğunu görebildiğim başlatıcılar olarak geçen değerlerle ilgisi var. –

cevap

0

, bunu durduracak.

2

Sekme kapandığında her zaman yeni bağımlılık özellikleri kaydediyor musunuz? Referans verildiyse aynı bağımlılık kaydı kaydını tekrar kullanamayacağınızdan kesinlikle eminim. Sekmeyi kapattığınızda çöp toplayıcı "ConnectionString" nesnesini yemeye çalışır. Statik olarak okunmuş olsa bile, sekme kapsam kaybettiğinde tüm alt değişkenleri elden çıkarır.

1

Bu sonsuz döngüde, OnPropertyChanged'e yanıt olarak IntegratedSecurity özelliğine atanan kim? Bunun kim olduğunu bulursanız, cevabınızın anahtarı budur.

İlgili konular