1. WPF的XAML方式异步绑定:
Step1:定义获取数据的方法,这里以省市县作为例子
- classRegionDAO{
- SOPEntitiesentity=newSOPEntities();
- publicList<Province>GetAllProvince(){
- List<Province>list=entity.Provinces.ToList();
- returnlist;
- }
- publicList<City>GetCitiesFromProvince(int?pid){
- if(!pid.HasValue){
- returnnull;
- }
- List<City>list=entity.Cities.Where(c=>c.ProvinceID==pid).ToList();
- returnlist;
- }
- publicList<County>GetCountiesFromCity(int?cid){
- if(!cid.HasValue){
- returnnull;
- }
- List<County>list=entity.Counties.Where(c=>c.CityID==cid).ToList();
- returnlist;
- }
- }
Step2:在XAML定义数据获取,这里使用ObjectDataProvider,注意获取城市的方法参数是int?,但是XMAL中不能如此定义,就以0作为初始值,反正0也查不到数据,但是如果0可以查到数据,那么你要考虑其他方式了。
- <Window.Resources>
- <!--DataBinding-->
- <ObjectDataProviderx:Key="data_Province"ObjectType="{x:Typedao:RegionDAO}"MethodName="GetAllProvince"IsAsynchronous="True"/>
- <ObjectDataProviderx:Key="data_City"ObjectType="{x:Typedao:RegionDAO}"MethodName="GetCitiesFromProvince">
- <ObjectDataProvider.MethodParameters>
- <sys:Int32>0</sys:Int32>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <ObjectDataProviderx:Key="data_County"ObjectType="{x:Typedao:RegionDAO}"MethodName="GetCountiesFromCity">
- <ObjectDataProvider.MethodParameters>
- <sys:Int32>0</sys:Int32>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <ObjectDataProviderx:Key="data_Workshop"ObjectType="{x:Typedao: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选中的内容
- <ComboBoxStyle="{StaticResourcestyleComboBox}"Name="cboProvince"Grid.Row="0"Grid.Column="1"
- ItemsSource="{BindingSource={StaticResourcedata_Province}}"DisplayMemberPath="ProvinceName"SelectedValuePath="ProvinceID"SelectionChanged="cboProvince_SelectionChanged"/>
- <ComboBoxStyle="{StaticResourcestyleComboBox}"Name="cboCity"Grid.Row="1"Grid.Column="1"
- ItemsSource="{BindingSource={StaticResourcedata_City}}"DisplayMemberPath="CityName"SelectedValuePath="CityID"SelectionChanged="cboCity_SelectionChanged"/>
- <ComboBoxStyle="{StaticResourcestyleComboBox}"Name="cboCounty"Grid.Row="2"Grid.Column="1"
- ItemsSource="{BindingSource={StaticResourcedata_County}}"DisplayMemberPath="CountyName"SelectedValuePath="CountyID"/>
Step4:部分后置代码,作用是当选中省时,取得ComboBox的SelectedValue值作为查询城市的参数
- privatevoidcboProvince_SelectionChanged(objectsender,SelectionChangedEventArgse){
- ObjectDataProviderprovider=this.FindResource("data_City")asObjectDataProvider;
- if(provider!=null){
- provider.MethodParameters[0]=((ComboBox)sender).SelectedValue;
- }
- }
- privatevoidcboCity_SelectionChanged(objectsender,SelectionChangedEventArgse){
- ObjectDataProviderprovider=this.FindResource("data_County")asObjectDataProvider;
- if(provider!=null){
- provider.MethodParameters[0]=((ComboBox)sender).SelectedValue;
- }
- }
2. 如果使用代码方式来进行绑定也很简单
- publicpartialclassUCViewStudents:UserControl{
- publicUCViewStudents(){
- InitializeComponent();
- //构造方法中采用数据绑定
- dgStudents.ItemsSource=LoadStudents();
- }
- }
但是有个问题是数据绑定不是异步的,如果数据量大需要全部拿到后才显示,需要异步绑定数据
- publicpartialclassUCViewStudents:UserControl{
- publicUCViewStudents(){
- InitializeComponent();
- Bindingbinding=newBinding();
- binding.IsAsync=false;//指定异步方式
- binding.Source=LoadStudents();
- dgStudents.SetBinding(DataGrid.ItemsSourceProperty,binding);
- }
- }