WPF MVVM模式下ComboBox級聯效果 選擇第一項


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>
View Code

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 });
        }
命令對應方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM