2012-02-24 7 views
12

私はWPF SQL Connection User Controlを使用しています。私は開いて、閉じて、もう一度開いたタブ(AvalonDock DocumentTab)にそれがあるときはいつでもStackOverflowExceptionを投げて問題があります。デフォルト値を含む依存関係プロパティThrowing StackOverflowException

私のアプリケーションに合わせてJakeの基本実装を使いこなしましたが、基本的に同じです。私は、データベースの選択を無効にするプロパティを追加しました。

私はこのような私のアプリケーションにコントロールを配置した:私はこの問題を解決するために、SqlConnectionStringBuilderのコードビハインドのいくつかのリファクタリングを行ってきたが、これはあるように思われる

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

問題のあるコード:SqlConnectionStringオブジェクトがOnPropertyChanged方法及びIntegratedSecurity性と無限ループに入ったタブの第二開口に

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

ConnectionStringプロパティをDependencyPropertyにしないと、この問題は発生しません。私には、この問題は依存関係プロパティのデフォルト値であると言われています。

他の誰かがこの問題を抱えていないかどうかを確認するために私はオンラインを突き刺しましたが、自分でピックルを取得したようです。この問題は、this SO question about dependency properties which was answered as thread safetyに関してです。依存関係のプロパティがデフォルト値をどのように扱うかはわかりませんが、同じオブジェクトがOnPropertyChangedイベントの2倍の問題を抱えていることがわかりました。しかし、これはまた、もし私がそうであれば、この問題はどこかで指摘されていたと信じています!

どのような考えですか?

追加情報
に私は、依存関係プロパティ(ヌルに設定)の登録からデフォルト値を削除しました。これにより、問題の発生を防止します。このソリューションの唯一の欠点は、UIがnullの状態であり、デフォルトの選択がないことです。しかし、私はその問題を解決することによってそれができないようにしたいと思います。セッターに

if (value != GetValue(ConnectionStringProperty)) 

を追加おそらく

+1

問題の内容は不明ですが、クラスのすべてのインスタンス**で共有されるため、デフォルト値を可変参照型のインスタンスに設定しないでください!可能であれば、代わりにSqlConnectionStringに値型を設定してください。 *編集:実際にはできません、このクラスはあなた自身のコードではないようです...* –

+0

@ThomasLevesque私はあなたが「**すべてのインスタンスで共有されます**」と釘付けにしたと思います。私はそれがプロパティの変更の無限ループにどのように入り込むのかわかりませんが、それがイニシャライザとして渡された値と関係しています。 –

答えて

0

は、それを停止します。

2

タブを閉じることによって新しい依存プロパティが削除されるたびに登録していますか?あなたが参照しているものが破棄されている場合、同じ依存関係プロパティの登録を再利用することはできません。タブを閉じると、ガベージコレクタは "ConnectionString"オブジェクトを食べようとします。タブがスコープを失ったときに、静的に読み込み専用であっても、すべての子変数を破棄します。

1

OnPropertyChangedに応答してIntegratedSecurityプロパティへの割り当てを行っている無限ループでは、それが誰であるかを知っていれば、これがあなたの答えの鍵です。

関連する問題