Подтвердить что ты не робот

Свойство зависимостей со значением значения по умолчанию StackOverflowException

Я использую WPF User Connection User Control. У меня возникла проблема с тем, что он бросает исключение StackOverflowException всякий раз, когда я его на вкладке (AvalonDock DocumentTab), которая была открыта, закрыта, а затем открыта во второй раз.

Я перепутал с реализацией базы Jake, чтобы лучше соответствовать моему приложению, но, по сути, это одно и то же. Я добавил свойство, которое отключает выбор базы данных.

Я поместил элемент управления в свое приложение следующим образом:

<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 не DependencyProperty, я не получаю эту проблему. Для меня это говорит о том, что проблема связана со значением по умолчанию свойства зависимостей.

Я ткнул в сети, чтобы узнать, есть ли у кого-то еще эта проблема, но похоже, что я, возможно, попал в немного рассола. Единственное, что я могу подумать, что это проблема, возможно, связано с этим вопросом SO о свойствах зависимостей, на который был дан ответ в виде безопасности потоков. Я не уверен, как свойства зависимостей относятся к их значениям по умолчанию, но я мог видеть, что если один и тот же объект был подключен дважды к проблеме с событием OnPropertyChanged. Однако это также заставляет меня поверить, что если бы это было так, то этот вопрос был бы отмечен где-то!

Любые мысли?

Дополнительная информация:
Я удалил значение по умолчанию из регистрации свойства зависимостей (установите для него значение null). Это предотвращает возникновение проблемы. Единственным недостатком этого решения является то, что пользовательский интерфейс находится в состоянии null, не выбранном по умолчанию. Однако я хотел бы предотвратить это, если решить эту проблему.

4b9b3361

Ответ 1

Регистрируете ли новые свойства зависимостей каждый раз, когда они удаляются при закрытии вкладки? Я уверен, что вы не можете повторно использовать одну и ту же регистрацию свойств зависимостей, если она была удалена. Когда вы закроете вкладку, сборщик мусора попытается съесть ваш объект "ConnectionString". Он будет утилизировать все дочерние переменные, когда вкладка теряет область действия, даже если они статичны только для чтения.

Ответ 2

В этом бесконечном цикле, кто выполняет назначение для свойства IntegratedSecurity в ответ на OnPropertyChanged? Если вы узнаете, кто это, это ключ к вашему ответу.

Ответ 3

Возможно, добавив

if (value != GetValue(ConnectionStringProperty))

в сеттере остановит его.