Я создаю приложение, в котором пользователи могут редактировать основные данные дочернего элемента, и я пытаюсь создать бесшовный опыт для пользователя, сохраняя изменения, которые они сделали для этого ребенка ,WPF MVVM Связывание вложенного свойства
У меня есть модель под названием Child.
class Child
{
[Key]
public int ID { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
У меня есть мнение (ChildMasterDataView), который дисплей в ПгвЬЫате и Фамилию в текстовых полях, которые доступны для редактирования.
<!--First name-->
<Label Content="First name:" />
<TextBox Text="{Binding Path=Child.FirstName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<!--Surname-->
<Label Content="Surname:" />
<TextBox Text="{Binding Path=Child.Surname, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
У меня есть класс, который обрабатывает реализацию интерфейса INotifyPropertyChanged.
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
У меня есть ViewModel, который, как предполагается, чтобы сохранить изменения, внесенные в Firstname и фамилию, когда соответствующее свойство изменяется. Проблема заключается в том, что Firstname и фамилия вложены свойства класса ребенка, и не стреляя событие PropertyChanged ...
class ChildMasterDataViewModel : ObservableObject
{
private Database db; // Database context
public ChildViewModel()
{
db = new Database();
Child = db.Children.ToList().Where(e => e.PlbNr == 1).FirstOrDefault(); // Won't be null because child has been chosen earlier
PropertyChanged += ChildPropertyChanged;
}
private Child child;
public Child Child
{
get { return child; }
set { child = value; RaisePropertyChangedEvent("Child"); }
}
private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
{
db.SaveChanges();
}
}
Я могу сделать то, что я хочу, делая следующие изменения в ViewModel (и ofc изменение привязки вида):
class ChildMasterDataViewModel : ObservableObject
{
private Database db; // Database context
private Child child;
public ChildViewModel()
{
db = new Database();
child = db.Children.ToList().Where(e => e.PlbNr == 1).FirstOrDefault(); // Won't be null because child has been chosen earlier
PropertyChanged += ChildPropertyChanged;
}
public string FirstName
{
get { return child.FirstName; }
set { child.FirstName= value; RaisePropertyChangedEvent("FirstName"); }
}
public string Surname
{
get { return child.Surname; }
set { child.Surname= value; RaisePropertyChangedEvent("Surname"); }
}
private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
{
db.SaveChanges();
}
}
Это не может быть правильно, но должен быть лучший способ?
Я попытался реализовать ObservableObject в классе Child, а затем в ViewModel, подписав событие PropertyChanged класса Child на метод ChildPropertyChanged в ViewModel. Это не сработало.
Существует только 3 способа сделать то, что вы хотите. 1) Модель обертки - вы уже сделали это, подумал, что для INotifiPropertyChanged будет проще, imho. 2) Вы добавите INotifyPropertyChanged прямо к вашей модели. 3) Вы создадите класс stadalone, который реализует INotifypropertyChanged или выводится из ObservableObject. И этот класс должен обрабатывать вашу модель как ** input ** и обрабатывать ее самостоятельно, чтобы инициализировать ее свойства, которые вы свяжете. Вам также нужно будет сделать обратную трансформацию. – Shakra
Если вы привязаны к нему, он должен, вероятно, реализовать INotifyPropertyChanged. И IDataErrorInfo тоже. – Will