Uno degli aspetti meno conosciuti del databinding di WPF è la naturale gestione degli aggiornamenti nel caso questi avvengano da un thread secondario.
Supponiamo di avere una fonte dati che quando il metodo QueryValue viene invocato aggiorni i propri dati attraverso un thread secondario in modo da non bloccare l'intera applicazione.
class MyData:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int Value { get; set; }
public void QueryValue()
{
ThreadPool.QueueUserWorkItem(delegate(object o)
{
Thread.Sleep(3000);
Value++;
if (PropertyChanged != null)
{
PropertyChanged(this,new PropertyChangedEventArgs("Value"));
}
});
}
A questo punto cerchiamo di utilizzarla in un windows form composto da un pulsante (button1) e una textbox (textbox1) con questo semplice esempio:
public partial class Form1 : Form
{
MyData myData = new MyData();
public Form1()
{
InitializeComponent();
textBox1.DataBindings.Add("Text", myData, "Value");
}
private void button1_Click(object sender, EventArgs e)
{
myData.QueryValue();
}
}
Lanciando l'applicazione e premendo il pulsante avremo la classica eccezione: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.
Ripetiamo ora la prova in un applicazione WPF:
<Window x:Class="WPFTest.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>
<Button Margin="79,96,124,0" Name="button1" Height="23" VerticalAlignment="Top" Click="button1_Click">Button</Button>
<TextBox Height="21" Margin="60,53,98,0" Name="textBox1" Text="{Binding Path=Value}" VerticalAlignment="Top" />
</Grid>
public partial class Window1 : Window
{
MyData myData = new MyData();
public Window1()
{
InitializeComponent();
this.DataContext = myData;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
myData.QueryValue();
}
}
Eseguendo l'applicazione e premendo il pulsante il contenuto della textbox viene correttamente aggiornato.
Un altro "piccolo" dettaglio che fa guadagnare parecchi punti al databinding di WPF rispetto a quello dei Windows Forms. 
Technorati Tags:
WPF,
Databinding