2010-11-19 23 views
25

Cũng giống như có "điều trị cảnh báo là lỗi" được thiết lập trong các dự án của chúng tôi để nắm bắt các vấn đề có thể sớm, tôi rất thích có ngoại lệ thời gian chạy để bắt chúng sớm.Làm cách nào để tôi có thể biến các lỗi ràng buộc thành ngoại lệ thời gian chạy?

Gần đây, tôi đã gặp vấn đề này và tôi rất vui khi có điều này.

Có thể thực hiện được không? Và nếu có, làm thế nào?

Trả lời

39

Bạn có thể treo vào bộ sưu tập PresentationTraceSources với người nghe của riêng bạn:

public class BindingErrorListener : TraceListener 
{ 
    private Action<string> logAction; 
    public static void Listen(Action<string> logAction) 
    { 
     PresentationTraceSources.DataBindingSource.Listeners 
      .Add(new BindingErrorListener() { logAction = logAction }); 
    } 
    public override void Write(string message) { } 
    public override void WriteLine(string message) 
    { 
     logAction(message); 
    } 
} 

và sau đó treo nó trong code-behind

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     BindingErrorListener.Listen(m => MessageBox.Show(m)); 
     InitializeComponent(); 
     DataContext = new string[] { "hello" }; 
    } 
} 

Đây là XAML với một lỗi ràng buộc

<Grid> 
    <TextBlock Text="{Binding BadBinding}" /> 
</Grid> 
+1

Tính năng này chỉ hoạt động khi tôi chạy ứng dụng trong studio trực quan? Làm thế nào về khi tôi xuất bản ứng dụng của tôi để chia sẻ và chạy exe wpf từ đó? – Jithu

8

Tôi đã triển khai giải pháp rất giống với giải pháp do Dean Chalk đề xuất:

  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 đơn vị kiểm tra.

Exception in Visual Studio

+1

Tuyệt. Bạn có thể biến nó thành gói NuGet. –

+4

@ RobertVažan Xong! https://www.nuget.org/packages/WpfBindingErrors/ –

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