Свойство зависимости со значением по умолчанию, генерирующим StackOverflowException - PullRequest
12 голосов
/ 24 февраля 2012

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

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

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

<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, без выбора по умолчанию.Я хотел бы предотвратить это, решив проблему.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2012

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

1 голос
/ 03 мая 2012

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

0 голосов
/ 28 февраля 2012

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

if (value != GetValue(ConnectionStringProperty))

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

...