2011-01-20 34 views
8

Theo document này, các mã sau đây gây ra rò rỉ bộ nhớ trong WPF:Có cách nào để xóa các ràng buộc khỏi tất cả các phần tử bị ràng buộc trên một sự kiện đóng biểu mẫu không?

myDataBinding = new Binding("Children.Count"); 
myDataBinding.Source = myGrid; 
myDataBinding.Mode = BindingMode.OneWay; 
MyTextBlock.SetBinding(TextBlock.TextProperty, myDataBinding); 

Cùng xảy ra nếu chúng ta ràng buộc một số giá trị trong XAML:

<TextBlock Name="MyTextBlock" Text="{Binding ElementName=myGrid, Path=Children.Count}" /> 

Để tránh rò rỉ bộ nhớ ràng buộc chúng ta cần phải loại bỏ ràng buộc đối với các sự kiện gần dạng như thế này:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty); 

Câu hỏi:

Có cách nào để xóa các ràng buộc khỏi tất cả các phần tử bị ràng buộc trên điều khiển biểu mẫu và con không?

Có vẻ như tôi sẽ cần một số phương pháp đệ quy ở đây.

Trả lời

4

Hãy nhớ rằng ví dụ được đưa ra rất cô lập và không điển hình trong tình huống ràng buộc. Các tài liệu tham khảo phác thảo này ...

Việc kiểm soát TextBlock có một ràng buộc để một đối tượng (myGrid) mà có một tham chiếu trở lại TextBlock (nó là một trong những myGrid cho trẻ em).

Vấn đề nằm ở thực tế là các ràng buộc đang diễn ra trên khắp UIElement đối tượng và một trong những đối tượng là con của container VÀ propety được binded đến được không phải là một DependencyProperty. Một lần nữa đây không phải là điển hình như hầu hết các ràng buộc xảy ra trên một đối tượng/tài sản mà thực hiện INotifyPropertyChanged.

Nếu bạn có nhiều liên kết như thế này trong ứng dụng của bạn thì cách tiếp cận nên là xóa chúng khi cần khi vùng chứa đã đóng như đã đề cập trong tài liệu được tham chiếu.

Cách tiếp cận khác là chỉ phơi bày dữ liệu bạn cần trên đối tượng của bạn đang được Chế độ xem xem và bỏ qua ràng buộc với thuộc tính UIElement không thuộc loại DependencyPrperty. Trong khi điều này không phải lúc nào cũng thực tế, nó sẽ làm giảm bớt bạn khỏi vấn đề được đề cập ở trên.

6

Trong WPF 4 bạn có thể không lo lắng về rò rỉ khi liên kết với một đối tượng ngay cả khi nó không phải là INotifyPropertyChanged hoặc DependencyObject. Lỗi này đã được sửa.

Dù sao tôi giả sử BindingOperations.ClearAllBindings sẽ hữu ích.

+0

Bạn có thể cung cấp liên kết hoặc tham chiếu tới lỗi này đang được khắc phục trong WPF 4 không? – kevindaub

+0

http://support.microsoft.com/kb/938416/en-us Tôi thấy rằng nó đã được cố định bằng cách sử dụng các thử nghiệm của riêng tôi –

+2

Nhắm mục tiêu lại thử nghiệm từ [đây] (http://blogs.msdn.com/b /jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx) cho thấy sự cố vẫn xảy ra trong .Net 4. – vossad01

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