2009-04-17 27 views
5

Tôi muốn một cách đơn giản để đảm bảo rằng tất cả các ràng buộc mà tôi đã khai báo trong các tệp xaml của tôi đều đi đến các thuộc tính thực. Thậm chí tốt hơn, tôi muốn khởi tạo cửa sổ wpf của tôi trong một bài kiểm tra đơn vị và gọi một phương pháp để đảm bảo rằng các ràng buộc là chính xác.Làm cách nào để xác thực các ràng buộc wpf sẽ chuyển sang các thuộc tính thực?

Thật không may, wpf thậm chí không ném ngoại lệ nếu tôi có điều gì đó sai. Điều đó khiến tôi trở thành gánh nặng để "khám phá" các vấn đề trong giai đoạn QA.

Có ai biết cách tôi có thể xác thực tốt hơn các ràng buộc của mình không?

Trả lời

4

Một cách tối ưu sẽ được tìm kiếm thông qua cây thị giác cho tất cả các thuộc tính phụ thuộc, và sau đó kiểm tra:

var bindingExpression = BindingOperations.GetBindingExpressionBase(dependencyObject, dependencyProperty); 

if (bindingExpression != null) 
{ 
    var status = bindingExpression.Status; 
} 

Nếu statusUnattached thì biểu thức đã không được giải quyết.

Tất nhiên, bạn sẽ không muốn thực hiện việc này trong ứng dụng sản xuất nhưng có thể có ý nghĩa trong một trường hợp kiểm tra lỗi hoặc tích hợp.

1

Lỗi ràng buộc dữ liệu hiển thị trong cửa sổ Visual Studio Output. Ví dụ: giả sử tôi muốn liên kết một TextBlock với thuộc tính Tiêu đề của Cửa sổ nhưng tôi nhập nhầm "Tiêu đề" là "Ritle". Tôi sẽ thấy điều này trong cửa sổ đầu ra:

System.Windows.Data Error: 39 : BindingExpression path error: 'Ritle' property not found on 'object' ''MessageWindow' (Name='Window')'. BindingExpression:Path=Ritle; DataItem='MessageWindow' (Name='Window'); target element is 'TextBlock' (Name='WindowTitle'); target property is 'Text' (type 'String')

Bạn có thể kiểm soát nhiều hơn cách các thông báo này được báo cáo bằng cách sử dụng các nguồn theo dõi. This article bởi Bea Stollnitz mô tả chi tiết hơn.

+0

Tôi nghe những gì bạn đang nói, nhưng điều đó không thực sự xác thực các ràng buộc của bạn. Nó chỉ cung cấp thông tin gỡ lỗi mà nhà phát triển phải xem xét kỹ lưỡng. Tôi nghĩ rằng một nỗ lực để viết một TraceListener mà ném khi nó "phát hiện ra" một lỗi ràng buộc sẽ khá mong manh, cho rằng nó sẽ phải phân tích các thông điệp có thể thay đổi theo ý thích của Microsoft. Có lẽ tốt hơn là không có gì, mặc dù. –

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