Capire perchè un binding non funziona come dovrebbe in WPF non è molto semplice, immaginiamo questa semplice situazione:
XAML
<Window x:Class="WPF_Databind.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBox
Text="{Binding Path=CustomerName}"
Height="23" Margin="87,65,71,0" Name="textBox1" VerticalAlignment="Top" />
</Grid>
</Window>
Codice
namespace WPF_Databind
{
public partial class Window1 : Window
{
public Window1 ()
{
InitializeComponent();
this.DataContext = new Customer() { Name = "Foo", Id = 42 };
}
}
public class Customer
{
public string Name { get; set; }
public int Id { get; set; }
}
}
L'errore è evidente, ma ciò che conta è che l'unica informazione utile l'abbiamo nella Output Window:
Volendo ottenere maggiori dettagi relativi alla fase di binding, col framework 3.5 è possibile usare la nuova modalità di tracing esposta dalla classe PresentationTraceSources (in System.Diagnostics), modificando lo XAML precedente in:
<Window x:Class="WPF_Databind.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBox
Text="{Binding Path=CustomerName, diag:PresentationTraceSources.TraceLevel=High}"
Height="23" Margin="87,65,71,0" Name="textBox1" VerticalAlignment="Top" />
</Grid>
</Window>
nella output window troviamo molte più informazioni utili a capire il problema.
Nota per Silverlight 2.0: questo XAML:
<TextBox Text="{Binding Path=Name}" Height="23" Margin="87,65,71,0" Name="textBox1" VerticalAlignment="Top" />
genera un errore: "Object not set to an instance of an object", la sintassi supportata da Silverlight è:
<TextBox Text="{Binding Name}" Height="23" Margin="87,65,71,0" Name="textBox1" VerticalAlignment="Top" />