C# WPF & MVVM / обновление данных свойства с привязкой к объекту
Привет ребята,
На самом деле это мой первый вопрос. Я склонен находить все ответы, просматривая сеть, но еще не нашел ответа на этот вопрос...
*Я создал этот код специально для этого вопроса, посмотрите ниже, пожалуйста!*
Я пытался выяснить, есть ли какой-нибудь способ сделать что-то следующим образом:
1) у меня есть база модели представления с IPropertyChanged
2) у меня есть модель, например модель студента с 2 свойствами - ID и Name.
3) у меня есть простое представление MainWindow, которое устанавливается на MainWindowViewModel datacontext.
4) представление показывает сетку данных, ограниченную "Students" из MainWindowViewModel, которая является OC students - ObservableCollection<student>(со случайными данными, которые я вставил).
5) я настроил datagrid так, чтобы он имел SelectedItem = {Binding SelectedStudent}
6) я установил 2 текстовых поля для выбранного студента.ID и SelectedStudent.Name, и значения хорошо отображаются всякий раз, когда я выбираю студента.
7) я также вижу изменения в тексте текстового поля в пользовательском интерфейсе, но не в коде(!!!)
* Я установил UpdateSourceTrigger=on свойство changed, и связывание режим=с двусторонним движением
Проблема возникает всякий раз, когда я хочу попытаться отредактировать значения свойств, изменив текущее значение, показанное в текстовых полях.
Может быть, я не понимаю, что делаю, когда связываю таким образом, но я ставлю точку останова отладки на "get/set" моих свойств - ID и Name, и ничто, кажется, не вызывает метод "Set" (на SelectedStudent - может быть, это часть моей проблемы?).
Это работает, если я усердно работаю и создаю 2 новых свойства, таких как" Id "и" Name " В модели представления, и вместо этого привязываю их к текстовым полям... Я мог бы изменить их значение, и "набор" вызывал бы я мог видеть его на точке останова в самих свойствах - проблема начинается только тогда, когда я пытаюсь изменить дочерние свойства моего объекта...
Нужно ли мне установить stackpanel "local" datacontext(например) на что-то другое???
Просто чтобы вы знали, я работаю с PRISM, но я хочу сделать это как можно проще(если вы знаете ответ в PRISM, я хотел бы знать!).
Большое спасибо всем, кто пытается помочь!
-----------------
Код (все здесь!):
-----
ViewModelBase:
public class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName]string caller = null) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(caller)); } } }
----------------
MainWindowViewModel:
public class MainWindowViewModel : ViewModelBase { private ObservableCollection<Student> _students; private Student _selectedStudent = null; public Student SelectedStudent { get { return _selectedStudent; } set { _selectedStudent = value; OnPropertyChanged(); } } public ObservableCollection<Student> Students { get { return _students; } set { _students = value; OnPropertyChanged(); } } public MainWindowViewModel() { Students = new ObservableCollection<Student>(); Students.Add(new Student { Id = "0", Name = "Jackson" }); Students.Add(new Student { Id = "1", Name = "Jenny" }); } }
-----------------
Студент:
public class Student : ViewModelBase { private string _id; private string _name; public string Id { get { return _id; } set { _id = value; OnPropertyChanged(); } } public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } }
-------------------
Файл MainWindow.язык XAML:
<Window.DataContext> <local:MainWindowViewModel/> </Window.DataContext> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <TextBlock Text="Name: "/> <TextBox Text="{Binding SelectedStudent.Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/> <TextBlock Text="Id: "/> <TextBox Text="{Binding SelectedStudent.Id, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/> </StackPanel> <DataGrid Grid.Row="1" x:Name="dgStudents" ItemsSource="{Binding Students, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" SelectedItem="{Binding SelectedStudent, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" AutoGenerateColumns="True"/> </Grid>
Что я уже пробовал:
Все, что мог, многое видел в сети... Попробовал просмотреть путеводители по переплетам, но все, что они показали, - это в основном то, что я знаю.. Я не нашел этого конкретного случая редактирования, который я пытаюсь сделать - довольно удивительно...