具有默认值的依赖属性抛出StackOverflowException

Mik*_*e G 12 c# wpf dependency-properties wpf-controls

我正在使用WPF SQL连接用户控件.每当我在一个已打开,关闭然后再打开的选项卡(AvalonDock DocumentTab)上抛出StackOverflowException时,我遇到了一个问题.

我已经搞砸了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" />
Run Code Online (Sandbox Code Playgroud)

我已经完成了对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); }
}
Run Code Online (Sandbox Code Playgroud)

在选项卡的第二次打开时,SqlConnectionString对象将使用其OnPropertyChanged方法和IntegratedSecurity属性进入无限循环.当我使ConnectionString属性不是DependencyProperty我没有得到这个问题.对我来说,这说明问题是依赖属性的默认值.

我在网上偷看,看看是否有其他人有这个问题,但似乎我可能已经让自己陷入了一些困境.我认为这个问题可能来自唯一接近的问题是关于依赖属性的这个问题,这个问题被作为线程安全来回答.我不确定依赖属性如何处理它们的默认值,但我可以看到,如果同一个对象连接了两次OnPropertyChanged事件的问题.然而,这也让我相信,如果是这种情况,这个问题会在某处被注意到!

有什么想法吗?

附加信息:
我从依赖项属性的注册中删除了默认值(将其设置为null).这可以防止问题发生.此解决方案的唯一缺点是UI处于null状态,没有默认选择.不过,我想通过解决问题来防止这种情况发生.

Pri*_*Key 0

可能,添加一个

if (value != GetValue(ConnectionStringProperty))
Run Code Online (Sandbox Code Playgroud)

在设置器中会阻止它。