== Debugging ==
* Enable WPF debug output. In Visual Studio, Options > Debugging > Output Window > WPF Trace Settings > Data Binding > All.
* Add a high TraceLevel to your binding: System.Diagnostics.PresentationTraceSources.SetTraceLevel(NewBinding, System.Diagnostics.PresentationTraceLevel.High);
* Run application, and review log in "Output" tab in Visual Studio.
* Add ''System.Diagnostics'' entry to ''app.exe.config''. See:
* [[swdev:dotnet:debugging|Debugging for .NET]]
* [[http://www.thejoyofcode.com/System.Diagnostics_hidden_SourceLevels.aspx|The Joy of Code: System.Diagnostics Hidden SourceLevels]]
* [[http://msdn.microsoft.com/en-us/library/aa345169.aspx|MSDN: PresentationTraceSources Class]]
* [[http://msdn.microsoft.com/en-us/library/system.diagnostics.presentationtracesources.settracelevel.aspx|MSDN: SetTraceLevels]]
* [[http://msdn.microsoft.com/en-us/library/6w20x90k.aspx|MSDN: EventLog.WriteEntry method]]
* [[http://stackoverflow.com/questions/4026543/is-there-a-good-tool-for-debugging-xamls-databinding-behavior-errors-at-runtim|Tools for Debugging Data Binding at runtime]]
* [[http://bea.stollnitz.com/blog/?p=52|Bea Stollnitz: How can I debug WPF bindings?]]
== Using System.Diagnostics ==
=== Configuration File ===
Add the following to the ''//app//.exe.config'' file (must reside in the same folder and the ''//app//.exe''):
...
The ''SourceLevels'' used by the ''SourceSwitch'' (''//app//.exe.config'' configuration file) could be any of these:
public enum SourceLevels
{
All = -1,
Off = 0,
Critical = 1,
Error = 3,
Warning = 7,
Information = 15,
Verbose = 31,
ActivityTracing = 65280,
}
The listener could also be:
=== Writing Events ===
To write to the event log:
System.Diagnostics.Trace.TraceInformation("Some operation here: Hello World");
System.Diagnostics.Trace.TraceError("Error: Something failed here.");
Alternatively, and more flexible:
TraceSource srcMyApp = new TraceSource("srcMyAppDebug");
srcMyApp.TraceInformation("Some operation here: Hello World");
srcMyApp.TraceEvent(TraceEventType.Error, 0, "Error: Something failed here.");
The ''TraceEventType'' could be any of these:
public enum TraceEventType
{
Critical = 1,
Error = 2,
Warning = 4,
Information = 8,
Verbose = 16,
Start = 256,
Stop = 512,
Suspend = 1024,
Resume = 2048,
Transfer = 4096,
}
Another example:
using System.Diagnostics;
private void WriteToEventLog(string message)
{
string cs = "srcMyApp";
EventLog elog = new EventLog();
if (!EventLog.SourceExists(cs))
{
EventLog.CreateEventSource(cs, cs);
}
elog.Source = cs;
elog.EnableRaisingEvents = true;
elog.WriteEntry(message);
}
Another example (by Microsoft):
using System;
using System.Diagnostics;
using System.Threading;
class MySample{
public static void Main(){
// Create the source, if it does not already exist.
if(!EventLog.SourceExists("MySource"))
{
//An event log source should not be created and immediately used.
//There is a latency time to enable the source, it should be created
//prior to executing the application that uses the source.
//Execute this sample a second time to use the new source.
EventLog.CreateEventSource("MySource", "MyNewLog");
Console.WriteLine("CreatedEventSource");
Console.WriteLine("Exiting, execute the application a second time to use the source.");
// The source is created. Exit the application to allow it to be registered.
return;
}
// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = "MySource";
// Write an informational entry to the event log.
myLog.WriteEntry("Writing to event log.");
}
}