1. WPF的XAML方式异步绑定:
Step1:定义获取数据的方法,这里以省市县作为例子
- 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可以查到数据,那么你要考虑其他方式了。
- <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选中的内容
- <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值作为查询城市的参数
- 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. 如果使用代码方式来进行绑定也很简单
- public partial class UCViewStudents : UserControl {
- public UCViewStudents() {
- InitializeComponent();
- //构造方法中采用数据绑定
- dgStudents.ItemsSource = LoadStudents();
- }
- }
但是有个问题是数据绑定不是异步的,如果数据量大需要全部拿到后才显示,需要异步绑定数据
- public partial class UCViewStudents : UserControl {
- public UCViewStudents() {
- InitializeComponent();
- Binding binding = new Binding();
- binding.IsAsync = false;//指定异步方式
- binding.Source = LoadStudents();
- dgStudents.SetBinding(DataGrid.ItemsSourceProperty, binding);
- }
- }