私は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))
を追加おそらく
問題の内容は不明ですが、クラスのすべてのインスタンス**で共有されるため、デフォルト値を可変参照型のインスタンスに設定しないでください!可能であれば、代わりにSqlConnectionStringに値型を設定してください。 *編集:実際にはできません、このクラスはあなた自身のコードではないようです...* –
@ThomasLevesque私はあなたが「**すべてのインスタンスで共有されます**」と釘付けにしたと思います。私はそれがプロパティの変更の無限ループにどのように入り込むのかわかりませんが、それがイニシャライザとして渡された値と関係しています。 –