0

Im Utilisation de Simple MVVM Framework pour créer une application LOB Silverlight 4.0 simple.La liaison de la valeur sélectionnée de Combobox ne retourne pas dans la liaison de données bidirectionnelle

j'ai une liste des employés Voir qui affiche la liste de tous les employés et j'ai dans mon EmployeeListViewModel certaines propriétés comme suit:

private Grade selectedGrade; 
    public Grade SelectedGrade 
    { 
     get { return selectedGrade; } 
     set 
     { 
      selectedGrade = value; 
      NotifyPropertyChanged(m => m.SelectedGrade); 
     } 
    } 

    private Religion selectedReligion; 
    public Religion SelectedReligion 
    { 
     get { return selectedReligion; } 
     set 
     { 
      selectedReligion = value; 
      NotifyPropertyChanged(m => m.SelectedReligion); 
     } 
    } 
    private ObservableCollection<Grade> grades; 
    public ObservableCollection<Grade> Grades 
    { 
     get { return grades; } 
     set 
     { 
      grades = value; 
      NotifyPropertyChanged(m => m.Grades); 
     } 
    } 

    private ObservableCollection<Religion> religions; 
    public ObservableCollection<Religion> Religions 
    { 
     get { return religions; } 
     set 
     { 
      religions = value; 
      NotifyPropertyChanged(m => m.Religions); 
     } 
    } 
    private ObservableCollection<Department> departments; 
    public ObservableCollection<Department> Departments 
    { 
     get { return departments; } 
     set 
     { 
      departments = value; 
      NotifyPropertyChanged(m => m.Departments); 
     } 
    } 
    private Employee selectedEmployee; 
    public Employee SelectedEmployee 
    { 
     get { return selectedEmployee; } 
     set 
     { 
      selectedEmployee = value; 
      SetCanProperties(); 
      NotifyPropertyChanged(m => m.SelectedEmployee); 
     } 
    } 
    private ObservableCollection<Employee> employees; 
    public ObservableCollection<Employee> Employees 
    { 
     get { return employees; } 
     set 
     { 
      employees = value; 
      NotifyPropertyChanged(m => m.Employees); 
     } 
    } 
    private Department selectedDepartment; 
    public Department SelectedDepartment 
    { 
     get { return selectedDepartment; } 
     set 
     { 
      selectedDepartment = value; 
      NotifyPropertyChanged(m => m.SelectedDepartment); 
     } 
    } 

maintenant à mon avis j'ai un bouton pour modifier employé sélectionné dans mon employé liste qui ouvre une nouvelle fenêtre enfant avec les EmployeeDetails pour modifier

EmployeeListViewModel viewModel; 
    public EmployeeListView() 
    { 
     InitializeComponent(); 
     viewModel = (EmployeeListViewModel)DataContext; 
    } 

et est ici l'employé de modifier la méthode

private void editItemButton_Click(object sender, RoutedEventArgs e) 
    { 
     // Exit if no product selected 
     if (viewModel.SelectedEmployee == null) return; 

     // Create a product detail model 
     EmployeeDetailViewModel detailModel = 
      new EmployeeDetailViewModel(viewModel.SelectedEmployee); 
     // set comboboxes !! 

     detailModel.Departments = viewModel.Departments; 
     detailModel.Religions = viewModel.Religions; 

     detailModel.Grades = viewModel.Grades; 

     // Start editing 
     detailModel.BeginEdit(); 

     // Show EmployeeDetail view 
     EmployeeDetailView itemDetail = new EmployeeDetailView(detailModel); 
     itemDetail.Closed += (s, ea) => 
     { 
      if (itemDetail.DialogResult == true) 
      { 
       // Confirm changes 

       detailModel.EndEdit(); 
      } 
      else 
      { 
       // Reject changes 
       detailModel.CancelEdit(); 
      } 
     }; 
     itemDetail.Show(); 
    } 

maintenant mes détails Child Voir j'ai cette Constractor

public EmployeeDetailView(EmployeeDetailViewModel viewModel) 
    { 
     InitializeComponent(); 
     DataContext = viewModel; 
    } 

et voici mon DetailsViewModel constractor

public EmployeeDetailViewModel(Employee model) 
    { 
     base.Model = model; 
    } 
     private ObservableCollection<Religion> religions; 
    public ObservableCollection<Religion> Religions 
    { 
     get { return religions; } 
     set 
     { 
      religions = value; 
      NotifyPropertyChanged(m => m.Religions); 
     } 
    } 

    private ObservableCollection<Grade> grades; 
    public ObservableCollection<Grade> Grades 
    { 
     get { return grades; } 
     set 
     { 
      grades = value; 
      NotifyPropertyChanged(m => m.Grades); 
     } 
    } 
    private ObservableCollection<Department> departments; 
    public ObservableCollection<Department> Departments 
    { 
     get { return departments; } 
     set 
     { 
      departments = value; 
      NotifyPropertyChanged(m => m.Departments); 
     } 
    } 

après tout cela vient maintenant je lier ai trois comboboxes pour les ministères, les religions et les Grades (Quelles sont les clés étrangères dans ma table d'employés)

<ComboBox ItemsSource="{Binding Departments}" DisplayMemberPath="DepartmentName" SelectedValue="{Binding Model.Emp_Department, Mode=TwoWay}" SelectedValuePath="DepartmentId"/> 
    <ComboBox ItemsSource="{Binding Grades}" DisplayMemberPath="GradeName" SelectedValue="{Binding Model.Emp_Grade, Mode=TwoWay}" SelectedValuePath="GradeId"/> 

et ainsi de suite Le problème est que seule la zone de liste déroulante des départements met à jour la valeur source lorsque je change sa valeur

et les autres zones de liste déroulante ne le font pas .. même lorsque la déclaration de liaison est exactement la même chose !!

désolé pour l'écriture tellement .. mais quelqu'un peut-il m'aider avec cela ??

merci beaucoup

Répondre

0

Malheureusement, votre séparation MVVM est un peu foiré que vous liez de la vue directement au modèle sous-jacent (ce qui signifie une logique métier/validation dans le ViewModel) est contournée.

Cependant, vous semblez avoir tout en place pour que je suggère ce qui suit:

Changer votre Xaml à cette (notez le changement de SelectedValue à SelectedItem):

<ComboBox ItemsSource="{Binding Departments}" DisplayMemberPath="DepartmentName" SelectedItem="{Binding SelectedDepartment, Mode=TwoWay}"/> 
<ComboBox ItemsSource="{Binding Grades}" DisplayMemberPath="GradeName" SelectedItem="{Binding SelectedGrade, Mode=TwoWay}"/> 

Ensuite, dans le setter des propriétés SelectedDepartment/SelectedGrade, effectuez la validation requise, puis inscrivez l'ID de l'élément sélectionné dans les propriétés de votre modèle (detail).

Espérons que ça aide.

+0

désolé l'homme il n'a pas travaillé non plus .. la chose étrange est que le département combobox est le seul qui circule des données en arrière et en arrière .. même si le code est totalement le même pour tous le reste annule juste toutes les valeurs une fois que la fenêtre enfant est fermée !! – 3oon

+0

Pouvez-vous me donner le moyen optimal de travailler avec ce genre de situations ?? – 3oon

0

bien voici comment je fais mes combos:

<ComboBox ItemsSource="{Binding Path=ListPeople, UpdateSourceTrigger= PropertyChanged}" SelectedItem="{Binding Path=SelectedPerson, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="FirstName"/> 

et dans mon viewmodel:

private ObservableCollection<Person> listPeople = new ObservableCollection<Person>(); 

public IEnumerable<Person> ListPeople 
    { 
     get { return this.listPeople; } 
    } 

public Person SelectedPerson 
    { 
     get { return selectedPerson; } 
     set 
     { 
      selectedPerson = value; 
      if (selectedPerson != null) 
      { 
       NextToPayID = selectedPerson.PersonID; 
      } 
      base.RaisePropertyChanged("SelectedPerson"); 
     } 
    } 

voir si vous pouvez l'utiliser pour vous aider!

Questions connexes