2009-04-22 3 views
9

Каждый раз, когда я обнаружил, что я случайно сломал привязку данных в своем приложении. Либо переименовать свойство, либо не переименовать его в XAML, либо с помощью свойства, выбрасывающего исключение по какой-либо причине.Как распространять ошибки и исключения, возникающие при связывании данных WPF?

По умолчанию ошибки привязки данных регистрируются для отладки вывода, а исключения, которые были выбраны, пойманы и подавлены.

Есть ли простой способ получить исключение, возникшее после регистрации выхода отладки?

Я хочу знать как можно скорее, если привязка данных нарушена (в идеале подбирает ее в автоматическом тесте) и не рискует, что она может остаться незамеченной до тех пор, пока не будет проверена человеком.

ответ

11

После некоторого промедления я, наконец, приступил к кодированию решения моей первоначальной проблемы.

Мое решение использует пользовательский TraceListener (первоначально предложенный Джоном), который регистрируется в окне вывода. Окно вывода автоматически отображается и выдается на передний план при возникновении ошибки.

Вот мой TraceListener:

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

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

TraceListener определяется в System.Diagnostics.

Пользовательский TraceListener должен быть подключен к системе, которая будет использоваться. Официальный способ сделать это - установить что-то в реестре, а затем использовать файл App.config для настройки TraceListener.

Однако я обнаружил, что есть гораздо более простой способ сделать это программно:

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

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

PresentationTraceSources также определяется в System.Diagnostics.

Дополнительную информацию о источниках трассировки см. В статье blog Майка Хиллберга.

Bea Stollnitz имеет полезную информацию о ней blog.

+1

Я обнаружил, что это только улавливает ошибки при подключении отладчика. Когда отладчик не подключен, WPF не испускает ошибки в первую очередь. (?) Кто-нибудь еще испытал это? – pauldoo

+1

При дальнейших исследованиях это просто поведение при потере, которое изменяется при подключении отладчика. Используйте 'System.Diagnostics.Trace.AutoFlush = true;' исправлена ​​наша проблема. – pauldoo

+2

Полный пример: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d – Thomas

2

Посмотрите на this blog article, который может помочь обойти эту проблему.

+0

Именно то, что я бы писал, кроме того что я не мог вспомнить, связь ... – Benjol

+0

Это хорошая статья об отладке проблем с привязками данных.Но это зависит от того, что вы обнаружили проблемы в первую очередь? На самом деле это не тот ответ. То, что я хочу (если это возможно), является кратким описанием того, как сделать проблемы с привязкой к данным более заметными. –

+0

Вы можете создать пользовательский прослушиватель трассировки, который генерирует исключения – John

0

Я реализовал решение, очень похожее на принятый ответ:

  1. построив TraceListener, генерирующее вместо лесозаготовок
  2. Добавлены что слушатель PresentationTraceSources.DataBindingSource

Пожалуйста, смотрите complete solution on GitHub, она включает в себя демонстрационное приложение и единичный тестовый проект.

Exception in Visual Studio

Смежные вопросы