繁体   English   中英

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

[英]Update combobox MVVM (XAML & C#)

我在其他领域中有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:

当我选择一个品牌商品时,只有下一个代码被调用,并且顺序如下:

第一个(在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;           
            }

第三 (在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 ;
    }

问题出在GetMarcas()方法中。 如您所见,您不使用属性,而是使用“ marcas”字段。 但是,当您为字段分配值时(在特殊情况下,marcas = new ObservableCollection();),不会调用PropertyChanged方法。 这就是为什么您看不到UI更改的原因。 您应该使用属性而不是field,或者可以清除现有的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;
}

还有一种称为“不要忽略返回值”的优良作法,如您所见,您不需要从GetMarcas返回ObservableCollection,因此可以重写它以使其不返回任何内容或重写调用代码(这取决于您现有的代码) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM