WPF使用异步绑定数据

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

Code:
  1. classRegionDAO{
  2. SOPEntitiesentity=newSOPEntities();
  3. publicList<Province>GetAllProvince(){
  4. List<Province>list=entity.Provinces.ToList();
  5. returnlist;
  6. }
  7. publicList<City>GetCitiesFromProvince(int?pid){
  8. if(!pid.HasValue){
  9. returnnull;
  10. }
  11. List<City>list=entity.Cities.Where(c=>c.ProvinceID==pid).ToList();
  12. returnlist;
  13. }
  14. publicList<County>GetCountiesFromCity(int?cid){
  15. if(!cid.HasValue){
  16. returnnull;
  17. }
  18. List<County>list=entity.Counties.Where(c=>c.CityID==cid).ToList();
  19. returnlist;
  20. }
  21. }

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

Code:
  1. <Window.Resources>
  2. <!--DataBinding-->
  3. <ObjectDataProviderx:Key="data_Province"ObjectType="{x:Typedao:RegionDAO}"MethodName="GetAllProvince"IsAsynchronous="True"/>
  4. <ObjectDataProviderx:Key="data_City"ObjectType="{x:Typedao:RegionDAO}"MethodName="GetCitiesFromProvince">
  5. <ObjectDataProvider.MethodParameters>
  6. <sys:Int32>0</sys:Int32>
  7. </ObjectDataProvider.MethodParameters>
  8. </ObjectDataProvider>
  9. <ObjectDataProviderx:Key="data_County"ObjectType="{x:Typedao:RegionDAO}"MethodName="GetCountiesFromCity">
  10. <ObjectDataProvider.MethodParameters>
  11. <sys:Int32>0</sys:Int32>
  12. </ObjectDataProvider.MethodParameters>
  13. </ObjectDataProvider>
  14. <ObjectDataProviderx:Key="data_Workshop"ObjectType="{x:Typedao: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. <ComboBoxStyle="{StaticResourcestyleComboBox}"Name="cboProvince"Grid.Row="0"Grid.Column="1"
  2. ItemsSource="{BindingSource={StaticResourcedata_Province}}"DisplayMemberPath="ProvinceName"SelectedValuePath="ProvinceID"SelectionChanged="cboProvince_SelectionChanged"/>
  3. <ComboBoxStyle="{StaticResourcestyleComboBox}"Name="cboCity"Grid.Row="1"Grid.Column="1"
  4. ItemsSource="{BindingSource={StaticResourcedata_City}}"DisplayMemberPath="CityName"SelectedValuePath="CityID"SelectionChanged="cboCity_SelectionChanged"/>
  5. <ComboBoxStyle="{StaticResourcestyleComboBox}"Name="cboCounty"Grid.Row="2"Grid.Column="1"
  6. ItemsSource="{BindingSource={StaticResourcedata_County}}"DisplayMemberPath="CountyName"SelectedValuePath="CountyID"/>

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

Code:
  1. privatevoidcboProvince_SelectionChanged(objectsender,SelectionChangedEventArgse){
  2. ObjectDataProviderprovider=this.FindResource("data_City")asObjectDataProvider;
  3. if(provider!=null){
  4. provider.MethodParameters[0]=((ComboBox)sender).SelectedValue;
  5. }
  6. }
  7. privatevoidcboCity_SelectionChanged(objectsender,SelectionChangedEventArgse){
  8. ObjectDataProviderprovider=this.FindResource("data_County")asObjectDataProvider;
  9. if(provider!=null){
  10. provider.MethodParameters[0]=((ComboBox)sender).SelectedValue;
  11. }
  12. }


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

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

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

Code:
  1. publicpartialclassUCViewStudents:UserControl{
  2. publicUCViewStudents(){
  3. InitializeComponent();
  4. Bindingbinding=newBinding();
  5. binding.IsAsync=false;//指定异步方式
  6. binding.Source=LoadStudents();
  7. dgStudents.SetBinding(DataGrid.ItemsSourceProperty,binding);
  8. }
  9. }














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值