2010-11-19 8 views
25

Genau wie es in unseren Projekten "Behandle Warnung als Fehler" gibt, um früh mögliche Probleme zu erkennen, würde ich gerne eine Laufzeit-Ausnahme haben, um sie früh zu fangen.Wie kann ich verbindliche Fehler in Laufzeitausnahmen umwandeln?

Ich bin kürzlich von diesem Problem gebissen worden und ich wäre froh gewesen, dies zu haben.

Kann es getan werden? Und wenn ja, wie?

Antwort

39

Sie in die PresentationTraceSources Sammlung mit Ihrem eigenen Hörer einhängen konnte:

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

und es dann in Code-Behind-Haken

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

Hier ist die XAML mit einem Bindungs ​​Fehler

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

Ist nur diese Arbeit, wenn ich in Visual Studio meine Anwendung ausführen? Wie wäre es wenn ich meine Anwendung auf einer Freigabe veröffentliche und die wpf exe von dort aus starte? – Jithu

8

Ich implementierte eine Lösung sehr ähnlich der von Dean Chalk vorgeschlagen:

  1. ein TraceListener abgeleitet, die anstelle der Protokollierung
  2. hinzugefügt führt, dass Zuhörer PresentationTraceSources.DataBindingSource

Bitte geben Sie die complete solution on GitHub sehen, ist es eine Demo-Anwendung enthält und einen Komponententest-Projekt.

Exception in Visual Studio

+1

Kühl. Sie könnten es in ein NuGet-Paket umwandeln. –

+4

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

Verwandte Themen