2011-10-11 44 views
0

使用简单MVVM框架创建简单的Silverlight 4.0 LOB应用程序。我的组合框选定的值绑定不会以双向方式回流数据绑定

我有一个雇员列表视图,显示列表中的所有员工,我有我的EmployeeListViewModel一些特性如下:

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); 
     } 
    } 

现在在我看来,我有一个按钮,在我的员工来编辑选定员工它开创了一个新的子窗口与EmployeeDetails编辑

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

这里列出的是编辑员工方法

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(); 
    } 
现在

我的详细信息子视图我有这个Constractor

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

,这里是我的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); 
     } 
    } 

毕竟这现在来结合我有三个组合框 的部门,宗教和等级(这是我员工表中的外键)

<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"/> 

等等..问题是,只有部门组合框正在更新源值,当我更改它的值

和其他组合框不..即使绑定语句完全相同!

很抱歉写这么多..但任何人都可以帮助我吗?

非常感谢

回答

0

很遗憾,您MVVM分离是有点搞砸了,你是从直接查看到底层模型(意味着视图模型的任何业务逻辑/确认)结合被绕过。

但是,你似乎一切准备就绪,所以我会建议如下:

更改您的XAML到这个(注意,从的SelectedValue到的SelectedItem的变化):二传手内

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

然后SelectedDepartment/SelectedGrade属性中,执行任何必需的验证,然后将所选项目的ID写入(detail)模型中的属性。

希望它有帮助。

+0

对不起,人也没有工作.. 奇怪的是,部门combobox是唯一一个来回流动数据,即使代码是完全相同的所有他们 其余的只是在子窗口关闭后将所有的值设置为空! – 3oon

+0

你可以给我最好的方式来处理这种情况吗? – 3oon

0

那么这里是我做我的连击:

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

,并在我的视图模型:

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"); 
     } 
    } 

看到,如果你可以用它来帮助!