1. WPF的XAML方式非同步綁定:
Step1:定義擷取資料的方法,這裡以省市縣作為例子
Code:
- class RegionDAO {
-
- SOPEntities entity = new SOPEntities();
-
- public List<Province> GetAllProvince() {
- List<Province> list = entity.Provinces.ToList();
- return list;
- }
-
- public List<City> GetCitiesFromProvince(int? pid) {
- if (!pid.HasValue) {
- return null;
- }
- List<City> list = entity.Cities.Where(c => c.ProvinceID == pid).ToList();
- return list;
- }
-
- public List<County> GetCountiesFromCity(int? cid) {
- if (!cid.HasValue) {
- return null;
- }
- List<County> list = entity.Counties.Where(c => c.CityID == cid).ToList();
- return list;
- }
- }
Step2:在XAML定義資料擷取,這裡使用ObjectDataProvider,注意擷取城市的方法參數是int?,但是XMAL中不能如此定義,就以0作為初始值,反正0也查不到資料,但是如果0可以查到資料,那麼你要考慮其他方式了。
Code:
- <Window.Resources>
- <!--Data Binding-->
- <ObjectDataProvider x:Key="data_Province" ObjectType="{x:Type dao:RegionDAO}" MethodName="GetAllProvince" IsAsynchronous="True" />
- <ObjectDataProvider x:Key="data_City" ObjectType="{x:Type dao:RegionDAO}" MethodName="GetCitiesFromProvince">
- <ObjectDataProvider.MethodParameters>
- <sys:Int32>0</sys:Int32>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <ObjectDataProvider x:Key="data_County" ObjectType="{x:Type dao:RegionDAO}" MethodName="GetCountiesFromCity">
- <ObjectDataProvider.MethodParameters>
- <sys:Int32>0</sys:Int32>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <ObjectDataProvider x:Key="data_Workshop" ObjectType="{x:Type dao:WorkshopDAO}" MethodName="GetWorkshopFromRegion">
- <ObjectDataProvider.MethodParameters>
- <sys:Int32>0</sys:Int32>
- <sys:Int32>0</sys:Int32>
- <sys:Int32>0</sys:Int32>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- </Window.Resources>
Step3:定義ComboBox控制項,注意要設定DisplayMemberPath顯示的內容,以及SelectedValuePath選中的內容
Code:
- <ComboBox Style="{StaticResource styleComboBox}" Name="cboProvince" Grid.Row="0" Grid.Column="1"
- ItemsSource="{Binding Source={StaticResource data_Province}}" DisplayMemberPath="ProvinceName" SelectedValuePath="ProvinceID" SelectionChanged="cboProvince_SelectionChanged" />
- <ComboBox Style="{StaticResource styleComboBox}" Name="cboCity" Grid.Row="1" Grid.Column="1"
- ItemsSource="{Binding Source={StaticResource data_City}}" DisplayMemberPath="CityName" SelectedValuePath="CityID" SelectionChanged="cboCity_SelectionChanged"/>
- <ComboBox Style="{StaticResource styleComboBox}" Name="cboCounty" Grid.Row="2" Grid.Column="1"
- ItemsSource="{Binding Source={StaticResource data_County}}" DisplayMemberPath="CountyName" SelectedValuePath="CountyID"/>
Step4:部分後置代碼,作用是當選中省時,取得ComboBox的SelectedValue值作為查詢城市的參數
Code:
- private void cboProvince_SelectionChanged(object sender, SelectionChangedEventArgs e) {
- ObjectDataProvider provider = this.FindResource("data_City") as ObjectDataProvider;
- if (provider != null) {
- provider.MethodParameters[0] = ((ComboBox)sender).SelectedValue;
- }
- }
-
- private void cboCity_SelectionChanged(object sender, SelectionChangedEventArgs e) {
- ObjectDataProvider provider = this.FindResource("data_County") as ObjectDataProvider;
- if (provider != null) {
- provider.MethodParameters[0] = ((ComboBox)sender).SelectedValue;
- }
- }
2. 如果使用代碼方式來進行綁定也很簡單
Code:
- public partial class UCViewStudents : UserControl {
- public UCViewStudents() {
- InitializeComponent();
- //構造方法中採用資料繫結
- dgStudents.ItemsSource = LoadStudents();
- }
- }
但是有個問題是資料繫結不是非同步,如果資料量大需要全部拿到後才顯示,需要非同步綁定資料
Code:
- public partial class UCViewStudents : UserControl {
- public UCViewStudents() {
- InitializeComponent();
-
- Binding binding = new Binding();
- binding.IsAsync = false;//指定非同步方式
- binding.Source = LoadStudents();
- dgStudents.SetBinding(DataGrid.ItemsSourceProperty, binding);
- }
- }