WPF使用非同步綁定資料

來源:互聯網
上載者:User

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

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.