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: ,