2012-02-24 18 views
12

Używam WPF SQL Connection User Control. Mam problem z wyrzucaniem StackOverflowException za każdym razem, gdy mam go na karcie (AvalonDock DocumentTab), który został otwarty, zamknięty, a następnie otwarty po raz drugi.Właściwość zależności z wartością domyślną Rzucanie StackOverflowException

Połączyłem z podstawową implementacją Jake'a, aby lepiej pasowało do mojej aplikacji, ale zasadniczo jest takie samo. Dodałem właściwość, która wyłącza wybór bazy danych.

Mam umieścił kontrolę do mojej aplikacji tak:

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

Zrobiłem trochę refaktoryzacji kodu z opóźnieniem w tej SqlConnectionStringBuilder, aby rozwiązać ten problem, ale to wydaje się być kod naruszającym przepisy:

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

na drugim otwartym na karcie obiektu SqlConnectionString ją w nieskończonej pętli z jej metody OnPropertyChanged i mienia IntegratedSecurity. Kiedy sprawiam, że właściwość ConnectionString nie jest DependencyProperty, nie otrzymam tego problemu. Według mnie jest to problem z domyślną wartością właściwości dependency.

Wsunąłem się do internetu, żeby sprawdzić, czy ktoś inny ma ten problem, ale wygląda na to, że mogłem się trochę pogubić. Jedyne, co wydaje mi się bliskie, że ten problem mógł pochodzić, to w odniesieniu do this SO question about dependency properties which was answered as thread safety. Nie jestem pewien, jak właściwości zależności traktować ich wartości domyślne, ale widziałem, że jeśli ten sam obiekt został podłączony dwa razy problem z wydarzeniem OnPropertyChanged. Jednak to również prowadzi mnie do przekonania, że ​​gdyby tak było, kwestia ta byłaby gdzieś zauważona!

Jakieś myśli?

Dodatkowe informacje:
usunąłem wartość domyślną z rejestracją właściwość zależność (ustaw go na null). Zapobiega to wystąpieniu problemu. Jedyną wadą tego rozwiązania jest to, że interfejs użytkownika znajduje się w stanie null, bez domyślnych wyborów. Chciałbym temu zapobiec, rozwiązując problem.

+1

Nie jesteś pewien, na czym polega problem, ale nie powinieneś ustawiać domyślnej wartości instancji zmiennego typu referencyjnego, ponieważ ** będzie ona współużytkowana przez wszystkie instancje ** twojej klasy! Jeśli możesz, zamiast tego uczyń SqlConnectionString typem wartości. * EDYCJA: w rzeczywistości nie możesz, ponieważ ta klasa nie wydaje się być w twoim własnym kodzie ...* –

+0

@ThomasLevesque Myślę, że przybiłeś go z "** to będzie wspólne dla wszystkich instancji **". Nie wiem, w jaki sposób dostaje się do nieskończonej pętli zmian właściwości, ale ma to związek z wartościami przekazywanymi jako inicjatory, co może być problemem. –

Odpowiedz

0

Prawdopodobnie dodanie

if (value != GetValue(ConnectionStringProperty)) 

w seter będzie go zatrzymać.

2

Czy rejestrujesz nowe właściwości zależności za każdym razem, gdy są usuwane przez zamknięcie karty? Jestem dość pewny, że nie można ponownie użyć tej samej rejestracji właściwości zależności, jeśli to, do czego się odwołuje, zostało usunięte. Po zamknięciu karty, garbage collector spróbuje zjeść twój obiekt "ConnectionString". Będzie usuwać wszystkie zmienne podrzędne, gdy karta straci zasięg, nawet jeśli są statyczne tylko do odczytu.

1

W tej nieskończonej pętli, kto robi przypisanie do właściwości IntegratedSecurity w odpowiedzi na OnPropertyChanged? Jeśli dowiesz się, kto to jest, jest to klucz do twojej odpowiedzi.

Powiązane problemy