2012-02-24 15 views
12

Estoy usando el WPF SQL Connection User Control. Estoy teniendo un problema lanzando un StackOverflowException cuando lo tengo en una pestaña (AvalonDock DocumentTab) que se ha abierto, cerrado y luego abierto por segunda vez.Propiedad de dependencia con valor predeterminado Lanzamiento de StackOverflowException

He estado jugando con la implementación básica de Jake para adaptarme mejor a mi aplicación, pero básicamente es la misma. He agregado una propiedad que desactiva la selección de una base de datos.

he colocado el control en mi aplicación como esta:

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

he hecho algunas refactorización del código subyacente de la SqlConnectionStringBuilder el fin de solucionar este problema, pero esto parece ser el código erróneo:

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

en el segundo abierto de la pestaña del objeto SqlConnectionString se mete en un bucle infinito con su método OnPropertyChanged y la propiedad IntegratedSecurity. Cuando hago que la propiedad ConnectionString no sea DependencyProperty, no consigo este problema. Para mí, esto dice que el problema es con el valor predeterminado de la propiedad de dependencia.

Busqué en línea para ver si alguien más ha tenido este problema, pero parece que puedo haberme metido en un poco de un pepinillo. Lo único cerca de lo que puedo pensar que puede haber venido este problema es con respecto al this SO question about dependency properties which was answered as thread safety. No estoy seguro de cómo las propiedades de dependencia tratan sus valores predeterminados, pero pude ver que si el mismo objeto se cableó dos veces el problema con el evento OnPropertyChanged. Sin embargo, esto también me lleva a creer que, si este fuera el caso, este problema se habría observado en alguna parte.

¿Alguna idea?

Información adicional:
Quité el valor por defecto del registro de la propiedad de dependencia (establecen a NULL). Esto evita que ocurra el problema. El único inconveniente de esta solución es que la UI está en un estado null, no hay selecciones predeterminadas. Sin embargo, me gustaría evitar que ese sea el caso al resolver el problema.

+1

No estoy seguro de cuál es el problema, pero no debe establecer el valor predeterminado para una instancia de un tipo de referencia mutable, porque ** será compartido por todas las instancias ** de su clase. Si puede, haga de SqlConnectionString un tipo de valor en su lugar. * EDITAR: en realidad no puedes, ya que esta clase no parece estar en tu propio código ...* –

+0

@ThomasLevesque Creo que lo has clavado con "** será compartido por todas las instancias **". No sé cómo entra en el ciclo infinito de cambios de propiedad, pero tiene que ver con los valores que se pasan como inicializadores. Podría ver que esto es un problema. –

Respuesta

0

Probablemente, la adición de un

if (value != GetValue(ConnectionStringProperty)) 

en la incubadora lo detendrá.

2

¿Está registrando nuevas propiedades de dependencia cada vez que se eliminan mediante el cierre de la pestaña? Estoy bastante seguro de que no puede reutilizar el mismo registro de propiedad de dependencia si lo que está haciendo referencia ha sido eliminado. Una vez que cierre la pestaña, el recolector de basura intentará comer su objeto "ConnectionString". Deshará de todas las variables secundarias cuando la pestaña pierda alcance, incluso si son estáticas de solo lectura.

1

En ese bucle infinito, ¿quién está asignando la propiedad IntegratedSecurity en respuesta a OnPropertyChanged? Si descubres quién es, esta es la clave de tu respuesta.

Cuestiones relacionadas