异步数据绑定
使用同步数据绑定时, UI会冻结.wpf中提供了异步形式的数据绑定.这样我们就不必自己开启线程来实现数据的异步绑定了(实际上wpf的异步功能也是开启了一个新的线程)
目前WPF中提供了两种DataProvider
第一种是XmlDataProvider,它本身就是异步的.
第二种是ObjectDataProvider.默认情况下是同步的(synchronal)
目前有两中情况下应当使用异步数据绑定.
1. Slow Data Source .例如调用一个Rss feed,外部的xml文件等
2. Slow property in quick DataSource. 数据源中的某个属性取值时非常缓慢.
第一种情况下可以使用XmlDataProvider或者ObjectDataProvider.
第二种使用下将Binding.IsSync设置为true就可以了(默认为false),当然使用XmlDataProvider或者ObjectDataProvider也可以.
下面用以小段程序来说明:
Slow
Data Source:
public class
SlowDataSouce
{
private
string myVar="tt";
public
string MyProperty
{
get {
return myVar; }
set {
myVar = value; }
}
public
SlowDataSouce()
{
//在生成实例时延迟了3秒钟
System.Threading.Thread.Sleep(3000);
}
}
绑定代码
ObjectDataProvider
odp = new ObjectDataProvider();
odp.IsAsynchronous = true;
odp.DataChanged += new EventHandler(odp_DataChanged);//当ObjectDataProvider的Data属性被赋予新值时引发该事件(也就时SlowDataSource类实例化完毕时)
odp.ObjectType = typeof(SlowDataSouce);
Binding
binding = new Binding("MyProperty");
binding.Source = new class1();
tb1.SetBinding(TextBox.TextProperty, binding);
Slow
Property:
public class SlowDataSouce
{
private
string myVar="tt";
public
string MyProperty
{
get {
//获取该属性时延迟了3秒钟
System.Threading.Thread.Sleep(3000);
return myVar; }
set {
myVar = value; }
}
public
SlowDataSouce()
{
}
}
Binding binding = new Binding("MyProperty");
binding.IsAsync = true;
binding.Source = new SlowDataSouce ();
tb1.SetBinding(TextBox.TextProperty, binding);