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. smile_wink

Technorati Tags: ,