更新组合框MVVM(XAML& C#)

时间:2015-03-21 18:45:33

标签: c# xaml mvvm combobox

我有一个包含2个组合的表单,以及其他字段。 1个组合充满了品牌名称( cmbMarca )。这个组合填写正确。 其他组合( cmbModelo )应填充所选品牌的型号。

我的问题是,在选择品牌(cmbBrand)时,不会更新模型组合( cmbModelo )。当我选择一个品牌时,运行所有代码,但不会在组合中显示任何项目" cmbModelo "

FillingForm.xaml

    <Input:SfComboBox x:Name="cmbMarca"   x:uid="BrandsCombo"
    DisplayMemberPath="marca"
ItemsSource="{Binding MarcasSAT.Marcas}"                                                       SelectedValue="{Binding marca, Mode=TwoWay}"
    SelectedValuePath="marca"     
    Tag="{Binding Path=SelectedMarca, Mode=TwoWay}"                                                     SelectionChanged="cmbMarca_SelectionChanged"/>  

    <Input:SfComboBox x:Name="cmbModelo"    x:uid="ModelosCombo" 
    DisplayMemberPath="modelo"    
    ItemsSource="{Binding ModelosSAT.Modelos}" 
     SelectedValue="{Binding modelo, Mode=TwoWay}"
    SelectedValuePath="modelo" />

FillingForm.CS

  private void cmbMarca_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
                MarcaViewModel curItem = (MarcaViewModel)cmbMarca.SelectedItem;               
                this.cmbMarca.Tag  = curItem.idMarca;
        } 

FillingViewModel.cs

public class FillingViewModel : ViewModelBase
{

        private readonly MarcasViewModel marcasSAT = new MarcasViewModel();
        public MarcasViewModel MarcasSAT
        {
            get { return this.marcasSAT; }
        }

        private ModelosViewModel modelosSAT = new ModelosViewModel();
        public ModelosViewModel ModelosSAT
        {
            get
            {
                return this.modelosSAT;
            }
            set
            {
                modelosSAT = value;
                RaisePropertyChanged("ModelosSAT");
            }
        }

        private int _selectedMarca;
        public int SelectedMarca
        {
            get { return _selectedMarca; }
            set 
            {
                _selectedMarca = value;
                RaisePropertyChanged("SelectedMarca");
                modelosSAT.MarcaID = _selectedMarca;           
            }
        }

}

ModelosViewModel.cs

 public class ModelosViewModel : ViewModelBase
    {
        private ObservableCollection<ModeloViewModel> modelos;
        public ObservableCollection<ModeloViewModel> Modelos
        {
            get
            {
                return modelos ;
            }
            set
            {
                modelos  = value;
                RaisePropertyChanged("Modelos");
            }
        }

        public ObservableCollection<ModeloViewModel> GetModelos()
        {
            modelos  = new ObservableCollection<ModeloViewModel>();
            using (var db = new SQLite.SQLiteConnection(App.DBPath))
            {
                var query = db.Table<Modelos>().Where(c => c.idMarca == _marcaID);   
                //var query = db.Table<Modelos>();   
                foreach (var _mrc in query)
                {
                    var mrc = new ModeloViewModel()
                    {
                        idMarca  = _mrc.idMarca,
                        idModelo = _mrc.idModelo,
                        modelo   = _mrc.modelo                          
                    };
                    modelos.Add(mrc);
                }
            }
            return modelos ;
        }

        private int _marcaID=0;
        public int MarcaID
        {
            get {
                return _marcaID; 
            }
            set
            {
                _marcaID = value;
                RaisePropertyChanged("MarcaID");
                this.GetModelos();
            }
        }

        //public ModelosViewModel()
        //{           
        //    this.modelos = GetModelos();
        //}

    }

MarcasViewModel.cs

 public class MarcasViewModel : ViewModelBase
    {
        private ObservableCollection<MarcaViewModel> marcas;
        public ObservableCollection<MarcaViewModel> Marcas
        {
            get
            {
                return marcas ;
            }

            set
            {
                marcas  = value;
                RaisePropertyChanged("Marcas");
            }
        }


        public ObservableCollection<MarcaViewModel> GetMarcas()
        {
            marcas = new ObservableCollection<MarcaViewModel>();
            using (var db = new SQLite.SQLiteConnection(App.DBPath))
            {
                var query = db.Table<Marcas>();
                foreach (var _mrc in query)
                {
                    var mrc = new MarcaViewModel()
                    {
                        idMarca  = _mrc.idMarca ,
                        marca  = _mrc.marca                         
                    };
                    marcas.Add(mrc);
                }
            }
            return marcas ;
        }

        public MarcasViewModel()
        {
            this.marcas = GetMarcas();
        }

    }

ViewModelBase.cs

 public class ViewModelBase
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

UPDATE1:

当我选择一个品牌商品时,只会调用下一个代码并按此顺序调用:

1st(在FillinfgForm.cs中)

 private void cmbMarca_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
                MarcaViewModel curItem = (MarcaViewModel)cmbMarca.SelectedItem;        
                this.cmbMarca.Tag  = curItem.idMarca;            
        }  

第二名(在FillingViewModel.cs中)

public int SelectedMarca 
  set 
            {
                _selectedMarca = value;
                RaisePropertyChanged("SelectedMarca");
                modelosSAT.MarcaID = _selectedMarca;           
            }

3rd (在ModelosViewModel.cs中)

Public int MarcaID
    {            
        set
        {
            _marcaID = value;
            RaisePropertyChanged("MarcaID");
            this.GetModelos();
        }
    }

第四

public ObservableCollection<ModeloViewModel> GetModelos()
    {
        modelos  = new ObservableCollection<ModeloViewModel>();
        using (var db = new SQLite.SQLiteConnection(App.DBPath))
        {
            var query = db.Table<Modelos>().Where(c => c.idMarca == _marcaID);   
            //var query = db.Table<Modelos>();   
            foreach (var _mrc in query)
            {
                var mrc = new ModeloViewModel()
                {
                    idMarca  = _mrc.idMarca,
                    idModelo = _mrc.idModelo,
                    modelo   = _mrc.modelo                          
                };
                modelos.Add(mrc);
            }
        }
        return modelos ;
    }

1 个答案:

答案 0 :(得分:3)

问题出在GetMarcas()方法中。 正如你所看到的,你不是在工作中工作,而是在工作场所工作 - &#39; marcas&#39;。但是当您为字段赋值(在特定情况下,marcas = new ObservableCollection();)不会调用PropertyChanged方法。这就是为什么你不看UI变化的原因。 您应该使用属性而不是字段,或者您可以清除现有的ObservableCollection并添加值。两种变体都应该有效。 所以下面的代码应该可以工作:

public ObservableCollection<MarcaViewModel> GetMarcas()
{
    Marcas = new ObservableCollection<MarcaViewModel>();
    using (var db = new SQLite.SQLiteConnection(App.DBPath))
    {
        var query = db.Table<Marcas>();
        foreach (var _mrc in query)
        {
            var mrc = new MarcaViewModel()
            {
                idMarca  = _mrc.idMarca ,
                marca  = _mrc.marca                         
            };
            marcas.Add(mrc);
        }
    }
    return marcas ;
}

或更好的解决方案:

public ObservableCollection<MarcaViewModel> GetMarcas()
{
    Marcas.Clear();
    using (var db = new SQLite.SQLiteConnection(App.DBPath))
    {
        var query = db.Table<Marcas>();
        foreach (var _mrc in query)
        {
            var mrc = new MarcaViewModel()
            {
                idMarca  = _mrc.idMarca ,
                marca  = _mrc.marca                         
            };
            Marcas.Add(mrc);
        }
    }
    return marcas;
}

还有一个很好的做法叫做&#34;不要忽略返回值&#34;,因为你可以看到你不需要从GetMarcas返回ObservableCollection,所以要么重写它以便它不返回任何内容或重写调用代码(它依赖于您现有的代码)。