WPF使用异步绑定数据

1. WPF的XAML方式异步绑定:
Step1:定义获取数据的方法,这里以省市县作为例子

Code:
  1. class RegionDAO {  
  2.   
  3.     SOPEntities entity = new SOPEntities();  
  4.   
  5.     public List<Province> GetAllProvince() {  
  6.         List<Province> list = entity.Provinces.ToList();  
  7.         return list;  
  8.     }  
  9.   
  10.     public List<City> GetCitiesFromProvince(int? pid) {  
  11.         if (!pid.HasValue) {  
  12.             return null;  
  13.         }  
  14.         List<City> list = entity.Cities.Where(c => c.ProvinceID == pid).ToList();  
  15.         return list;  
  16.     }  
  17.   
  18.     public List<County> GetCountiesFromCity(int? cid) {  
  19.         if (!cid.HasValue) {  
  20.             return null;  
  21.         }  
  22.         List<County> list = entity.Counties.Where(c => c.CityID == cid).ToList();  
  23.         return list;  
  24.     }  
  25. }  

Step2:在XAML定义数据获取,这里使用ObjectDataProvider,注意获取城市的方法参数是int?,但是XMAL中不能如此定义,就以0作为初始值,反正0也查不到数据,但是如果0可以查到数据,那么你要考虑其他方式了。

Code:
  1. <Window.Resources>  
  2.     <!--Data Binding-->  
  3.     <ObjectDataProvider x:Key="data_Province" ObjectType="{x:Type dao:RegionDAO}" MethodName="GetAllProvince" IsAsynchronous="True" />  
  4.     <ObjectDataProvider x:Key="data_City" ObjectType="{x:Type dao:RegionDAO}" MethodName="GetCitiesFromProvince">  
  5.         <ObjectDataProvider.MethodParameters>  
  6.             <sys:Int32>0</sys:Int32>  
  7.         </ObjectDataProvider.MethodParameters>  
  8.     </ObjectDataProvider>  
  9.     <ObjectDataProvider x:Key="data_County" ObjectType="{x:Type dao:RegionDAO}" MethodName="GetCountiesFromCity">  
  10.         <ObjectDataProvider.MethodParameters>  
  11.             <sys:Int32>0</sys:Int32>  
  12.         </ObjectDataProvider.MethodParameters>  
  13.     </ObjectDataProvider>  
  14.     <ObjectDataProvider x:Key="data_Workshop" ObjectType="{x:Type dao:WorkshopDAO}" MethodName="GetWorkshopFromRegion">  
  15.         <ObjectDataProvider.MethodParameters>  
  16.             <sys:Int32>0</sys:Int32>  
  17.             <sys:Int32>0</sys:Int32>  
  18.             <sys:Int32>0</sys:Int32>  
  19.         </ObjectDataProvider.MethodParameters>  
  20.     </ObjectDataProvider>  
  21. </Window.Resources>  

Step3:定义ComboBox控件,注意要设置DisplayMemberPath显示的内容,以及SelectedValuePath选中的内容

Code:
  1. <ComboBox Style="{StaticResource styleComboBox}" Name="cboProvince" Grid.Row="0" Grid.Column="1"   
  2.           ItemsSource="{Binding Source={StaticResource data_Province}}" DisplayMemberPath="ProvinceName" SelectedValuePath="ProvinceID" SelectionChanged="cboProvince_SelectionChanged" />  
  3. <ComboBox Style="{StaticResource styleComboBox}" Name="cboCity" Grid.Row="1" Grid.Column="1"  
  4.           ItemsSource="{Binding Source={StaticResource data_City}}" DisplayMemberPath="CityName" SelectedValuePath="CityID" SelectionChanged="cboCity_SelectionChanged"/>  
  5. <ComboBox Style="{StaticResource styleComboBox}" Name="cboCounty" Grid.Row="2" Grid.Column="1"  
  6.           ItemsSource="{Binding Source={StaticResource data_County}}" DisplayMemberPath="CountyName" SelectedValuePath="CountyID"/>  

Step4:部分后置代码,作用是当选中省时,取得ComboBox的SelectedValue值作为查询城市的参数

Code:
  1. private void cboProvince_SelectionChanged(object sender, SelectionChangedEventArgs e) {  
  2.     ObjectDataProvider provider = this.FindResource("data_City"as ObjectDataProvider;  
  3.     if (provider != null) {  
  4.         provider.MethodParameters[0] = ((ComboBox)sender).SelectedValue;  
  5.     }  
  6. }  
  7.   
  8. private void cboCity_SelectionChanged(object sender, SelectionChangedEventArgs e) {  
  9.     ObjectDataProvider provider = this.FindResource("data_County"as ObjectDataProvider;  
  10.     if (provider != null) {  
  11.         provider.MethodParameters[0] = ((ComboBox)sender).SelectedValue;  
  12.     }  
  13. }  


2. 如果使用代码方式来进行绑定也很简单

Code:
  1. public partial class UCViewStudents : UserControl {  
  2.     public UCViewStudents() {  
  3.         InitializeComponent();  
  4.         //构造方法中采用数据绑定  
  5.         dgStudents.ItemsSource = LoadStudents();  
  6.     }  
  7. }  

但是有个问题是数据绑定不是异步的,如果数据量大需要全部拿到后才显示,需要异步绑定数据

Code:
  1. public partial class UCViewStudents : UserControl {  
  2.     public UCViewStudents() {  
  3.         InitializeComponent();  
  4.   
  5.         Binding binding = new Binding();  
  6.         binding.IsAsync = false;//指定异步方式  
  7.         binding.Source = LoadStudents();  
  8.         dgStudents.SetBinding(DataGrid.ItemsSourceProperty, binding);  
  9.     }  
  10. }  














 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值