MVVM模式下做的省市區的級聯效果。通過改變ComboBox執行命令改變市,區。
解決主要問題就是默認選中第一項
1.首先要定義一個屬性,繼承自INotifyPropertyChanged接口。我這里用的Prism框架中集成的NotificationObject

/// <summary> /// 省 /// </summary> private ObservableCollection<MyArea> provinceBindingList; public ObservableCollection<MyArea> ProvinceBindingList { get { return provinceBindingList; } set { provinceBindingList = value; this.RaisePropertyChanged("ProvinceBindingList"); } } /// <summary> /// 市 /// </summary> private ObservableCollection<MyArea> cityBindingList; public ObservableCollection<MyArea> CityBindingList { get { return cityBindingList; } set { cityBindingList = value; this.RaisePropertyChanged("CityBindingList"); } } /// <summary> /// 區 /// </summary> private ObservableCollection<MyArea> areaBindingList; public ObservableCollection<MyArea> AreaBindingList { get { return areaBindingList; } set { areaBindingList = value; this.RaisePropertyChanged("AreaBindingList"); } } /// <summary> /// 默認選擇請選擇項 /// </summary> public readonly MyArea defaultSelectItem; /// <summary> /// 添加城市選擇項 /// </summary> private MyArea selectCity; public MyArea SelectCity { get { return selectCity; } set { selectCity = value; this.RaisePropertyChanged("SelectCity"); } }
2.XAML部分

<ComboBox SelectedIndex="0" ItemsSource="{Binding ProvinceBindingList,Mode=TwoWay}" SelectedItem="{Binding defaultSelectItem,Mode=TwoWay}" DisplayMemberPath="Name" Margin="5,105,5,5" Width="100" Name="cboProvince" Style="{StaticResource ComboBoxStyle}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding Path=DataContext.GetCity,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ComboBox}}" CommandParameter="{Binding Path=SelectedValue,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ComboBox}}" /> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox> <ComboBox SelectedIndex="0" ItemsSource="{Binding CityBindingList,Mode=TwoWay}" DisplayMemberPath="Name" SelectedItem="{Binding SelectCity,Mode=TwoWay}" Margin="5" Width="100" Grid.Row="1" Name="cboCity" Style="{StaticResource ComboBoxStyle}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding Path=DataContext.GetArea,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ComboBox}}" /> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox> <ComboBox SelectedIndex="0" ItemsSource="{Binding AreaBindingList,Mode=TwoWay}" DisplayMemberPath="Name" SelectedItem="{Binding SelectCity,Mode=TwoWay}" Margin="5" Width="100" Grid.Row="2" Name="cboArea" Style="{StaticResource ComboBoxStyle}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding Path=DataContext.GetAddCityInfoExecute,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ComboBox}}" CommandParameter="{Binding Path=SelectedValue,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ComboBox}}" /> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox>
3.命令部分
//初始化命令 this.GetProvince = new DelegateCommand(GetProvinceExecute); this.GetCity = new DelegateCommand<MyArea>(GetCityExecute); this.GetArea = new DelegateCommand(GetAreaExecute);

/// <summary> /// 獲取省 /// </summary> private void GetProvinceExecute() { var province = AreaManager.GetProvince(); province.Insert(0, defaultSelectItem); ProvinceBindingList = new ObservableCollection<MyArea>(province); } /// <summary> /// 獲取市 /// </summary> /// <param name="obj"></param> private void GetAreaExecute() { if (SelectCity != null && SelectCity.ID != "0") { var area = AreaManager.GetAreaByCID(SelectCity); area.Insert(0, defaultSelectItem); AreaBindingList = new ObservableCollection<MyArea>(area); } else if (SelectCity == null || SelectCity != null && SelectCity.ID == "0") AreaBindingList = new ObservableCollection<MyArea>(new List<MyArea>() { defaultSelectItem }); } /// <summary> /// 獲取區 /// </summary> /// <param name="obj"></param> private void GetCityExecute(MyArea province) { if (province != null && province.ID != "0") { var city = AreaManager.GetCityByPID(province); city.Insert(0, defaultSelectItem); CityBindingList = new ObservableCollection<MyArea>(city); SelectCity = defaultSelectItem; } else if (province == null || province != null && province.ID == "0") CityBindingList = new ObservableCollection<MyArea>(new List<MyArea>() { defaultSelectItem }); }