2009-04-22 27 views
9

Mọi lần tôi thường thấy rằng tôi đã vô tình bị ràng buộc dữ liệu trong ứng dụng của mình. Hoặc bằng cách đổi tên một thuộc tính và không đổi tên nó trong XAML hoặc bởi một thuộc tính ném một ngoại lệ vì một lý do nào đó.Làm thế nào để tuyên truyền lỗi và ngoại lệ xảy ra trong quá trình kết nối dữ liệu WPF?

Theo lỗi ràng buộc dữ liệu mặc định được ghi vào kết xuất gỡ lỗi và ngoại lệ được ném sẽ bị bắt và bị chặn.

Có cách nào dễ dàng để có ngoại lệ được ném sau khi đầu ra gỡ lỗi được ghi nhật ký không?

Tôi muốn biết càng sớm càng tốt nếu ràng buộc dữ liệu bị hỏng (lý tưởng chọn nó trong thử nghiệm tự động) và không mạo hiểm cơ hội không được chú ý cho đến khi được thử nghiệm bởi con người.

Trả lời

11

Sau một số sự trì hoãn, cuối cùng tôi đã đặt mã hóa giải pháp cho vấn đề ban đầu của mình.

Giải pháp của tôi sử dụng tùy chỉnh TraceListener (ban đầu được đề xuất bởi John) ghi nhật ký vào cửa sổ đầu ra. Cửa sổ đầu ra được tự động hiển thị và được mua vào nền trước khi xảy ra lỗi.

Đây là tôi TraceListener:

public class ErrorLogTraceListener : TraceListener 
{ 
    public override void Write(string message) 
    { 
     ... 
    } 

    public override void WriteLine(string message) 
    { 
     ... 
    } 
} 

TraceListener được định nghĩa trong System.Diagnostics.

Tùy chỉnh TraceListener phải được nối vào hệ thống sẽ được sử dụng. Cách chính thức để thực hiện việc này là đặt nội dung nào đó trong sổ đăng ký và sau đó sử dụng tệp App.config để định cấu hình TraceListener.

Tuy nhiên tôi phát hiện ra rằng có một cách dễ dàng hơn để làm điều này lập trình:

ErrorLogTraceListener listener = new ErrorLogTraceListener(); 
PresentationTraceSources.Refresh(); 

PresentationTraceSources.DataBindingSource.Listeners.Add(listener); 
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Error; 

PresentationTraceSources cũng được định nghĩa trong System.Diagnostics.

Để biết thêm thông tin về nguồn theo dõi, hãy xem blog của Mike Hillberg.

Bea Stollnitz có một số thông tin hữu ích về số blog của cô ấy.

+1

Tôi nhận thấy rằng điều này chỉ phát hiện lỗi khi trình gỡ lỗi được đính kèm. Khi trình gỡ rối không được đính kèm thì WPF không phát ra các lỗi ở vị trí đầu tiên .. (?) Có ai khác trải nghiệm điều này không? – pauldoo

+1

Khi điều tra thêm, đó chỉ là hành vi xả nước được thay đổi khi trình gỡ lỗi được đính kèm. Sử dụng 'System.Diagnostics.Trace.AutoFlush = true;' cố định vấn đề của chúng ta. – pauldoo

+2

Để biết ví dụ đầy đủ: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d – Thomas

2

Hãy xem this blog article có thể giúp giải quyết vấn đề này.

+0

Chính xác những gì tôi đã có thể đăng, ngoại trừ tôi không thể nhớ liên kết ... – Benjol

+0

Đây là một bài viết tốt về gỡ lỗi vấn đề với các ràng buộc dữ liệu.Nhưng nó phụ thuộc vào bạn đã phát hiện ra các vấn đề ở nơi đầu tiên phải không? Đây không thực sự là câu trả lời tôi đã làm. Những gì tôi muốn (nếu có thể) là một mô tả ngắn gọn về cách làm cho các vấn đề liên kết dữ liệu trở nên nổi bật hơn ngay từ đầu. –

+0

Bạn có thể tạo trình theo dõi tùy chỉnh để ném ngoại lệ – John

0

tôi thực hiện một giải pháp rất giống với câu trả lời được chấp nhận:

  1. nguồn gốc một TraceListener mà ném thay vì khai thác gỗ
  2. gia tăng mà nghe để PresentationTraceSources.DataBindingSource

Hãy xem complete solution on GitHub, nó bao gồm một ứng dụng demo và một dự án thử nghiệm đơn vị.

Exception in Visual Studio

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