2012-02-24 28 views
12

Tôi đang sử dụng WPF SQL Connection User Control. Tôi đang gặp vấn đề với việc ném StackOverflowException bất cứ khi nào tôi có trên tab (AvalonDock DocumentTab) đã được mở, đóng và sau đó mở lần thứ hai.Thuộc tính phụ thuộc với giá trị mặc định Throwing StackOverflowException

Tôi đã rối tung xung quanh việc triển khai cơ sở của Jake để phù hợp hơn với đơn đăng ký của tôi, nhưng về cơ bản thì giống nhau. Tôi đã thêm một thuộc tính vô hiệu hóa việc lựa chọn cơ sở dữ liệu.

tôi đã đặt sự kiểm soát vào ứng dụng của tôi như thế này:

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

tôi đã thực hiện một số refactoring của mã-đằng sau của các SqlConnectionStringBuilder để khắc phục vấn đề này, nhưng điều này dường như là mã vi phạm:

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

Trên mở thứ hai của tab đối tượng SqlConnectionString được vào một vòng lặp vô hạn với phương pháp OnPropertyChanged của nó và IntegratedSecurity tài sản. Khi tôi tạo thuộc tính ConnectionString không phải là DependencyProperty, tôi không gặp phải vấn đề này. Với tôi điều này nói rằng vấn đề là với giá trị mặc định của thuộc tính phụ thuộc.

Tôi chọc xung quanh trực tuyến để xem liệu có ai khác có vấn đề này hay không, nhưng có vẻ như tôi có thể đã tự xáo trộn một chút. Điều duy nhất gần mà tôi có thể nghĩ rằng vấn đề này có thể đến từ là liên quan đến this SO question about dependency properties which was answered as thread safety. Tôi không chắc chắn các thuộc tính phụ thuộc xử lý các giá trị mặc định của chúng như thế nào, nhưng tôi có thể thấy rằng nếu cùng một đối tượng đó bị treo lên gấp đôi vấn đề với sự kiện OnPropertyChanged. Tuy nhiên điều này cũng khiến tôi tin rằng nếu đây là trường hợp vấn đề này sẽ được ghi nhận ở đâu đó!

Mọi suy nghĩ?

Thông tin bổ sung:
Tôi đã xóa giá trị mặc định từ đăng ký thuộc tính phụ thuộc (đặt thành giá trị rỗng). Điều này ngăn sự cố xảy ra. Hạn chế duy nhất của giải pháp này là giao diện người dùng ở trạng thái null, không có lựa chọn mặc định. Tôi muốn ngăn chặn điều đó bằng cách giải quyết vấn đề.

+1

Không chắc chắn vấn đề là gì, nhưng bạn không nên đặt giá trị mặc định thành thể hiện của loại tham chiếu có thể thay đổi, vì ** nó sẽ được chia sẻ bởi tất cả các trường hợp ** của lớp học của bạn! Nếu bạn có thể, thay vào đó, hãy tạo SqlConnectionString một loại giá trị. * EDIT: thực sự bạn không thể, vì lớp này dường như không có trong mã của riêng bạn ...* –

+0

@ThomasLevesque Tôi nghĩ bạn đã đóng đinh nó bằng "** nó sẽ được chia sẻ bởi tất cả các trường hợp **". Tôi không biết làm thế nào nó được vào vòng lặp vô hạn của thay đổi tài sản, nhưng nó đã làm với các giá trị được thông qua như initializers tôi có thể thấy đây là một vấn đề. –

Trả lời

0

Có lẽ, thêm một

if (value != GetValue(ConnectionStringProperty)) 

trong setter sẽ ngăn chặn nó.

2

Bạn có đăng ký các thuộc tính phụ thuộc mới mỗi khi chúng được xử lý bằng việc đóng tab không? Tôi khá chắc chắn rằng bạn không thể tái sử dụng cùng một đăng ký tài sản phụ thuộc nếu những gì nó tham chiếu đã được xử lý. Khi bạn đóng tab, bộ thu gom rác sẽ cố gắng ăn đối tượng "ConnectionString" của bạn. Nó sẽ xử lý tất cả các biến con khi tab mất phạm vi, ngay cả khi chúng là chỉ đọc tĩnh.

1

Trong vòng lặp vô hạn đó, ai đang thực hiện gán cho thuộc tính IntegratedSecurity để đáp ứng với OnPropertyChanged? Nếu bạn tìm ra đó là ai, đây là chìa khóa cho câu trả lời của bạn.

Các vấn đề liên quan