Привязка выбранного значения в Combobox не возвращается в двухстороннем связывании данных - PullRequest
0 голосов
/ 11 октября 2011

Im Используя Simple MVVM Framework, создайте простое приложение 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();
    }

теперь в моих данных Child View У меня естьэтот Конструктор

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

и вот мой Конспектор DetailsViewModel

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

и т. д. Проблема в том, что только поле со списком Departments обновляет значение источника, когда я изменяю его значение

, а другие поля со списком не.. даже когда обязательный оператор точно такой же!

очень жаль, что так много написал .. но кто-нибудь может мне помочь с этим ??

спасибо большое

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

хорошо, вот как я делаю свои комбо:

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

и в моей 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");
         }
     }

посмотрите, можете ли вы использовать это, чтобы помочь!

0 голосов
/ 12 октября 2011

К сожалению, ваше разделение MVVM немного испорчено, поскольку вы связываете представление непосредственно с базовой моделью (что означает, что любая бизнес-логика / проверка в ViewModel) обойдена.

Однако вы, похоже, имеетевсе на месте, поэтому я бы предложил следующее:

Измените свой 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выполните любую необходимую проверку и затем запишите идентификатор выбранного элемента в свойствах вашей (подробной) модели.

Надеюсь, это поможет.

...