2016-08-15 4 views
0

Я создаю приложение, в котором пользователи могут редактировать основные данные дочернего элемента, и я пытаюсь создать бесшовный опыт для пользователя, сохраняя изменения, которые они сделали для этого ребенка ,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. Это не сработало.

+0

Существует только 3 способа сделать то, что вы хотите. 1) Модель обертки - вы уже сделали это, подумал, что для INotifiPropertyChanged будет проще, imho. 2) Вы добавите INotifyPropertyChanged прямо к вашей модели. 3) Вы создадите класс stadalone, который реализует INotifypropertyChanged или выводится из ObservableObject. И этот класс должен обрабатывать вашу модель как ** input ** и обрабатывать ее самостоятельно, чтобы инициализировать ее свойства, которые вы свяжете. Вам также нужно будет сделать обратную трансформацию. – Shakra

+0

Если вы привязаны к нему, он должен, вероятно, реализовать INotifyPropertyChanged. И IDataErrorInfo тоже. – Will

ответ

0

Лично я вижу, что нет причин не размещать простую реализацию INotifyPropertyChanged в вашей модели Child - ведь у нее есть свойства, которые меняются. Теперь вы можете привязываться к ним напрямую.

К тому же, почему сохраняется государственная часть вашего ViewModel? Я бы переместил это в модель или в отдельный менеджер сохранения. Предполагается, что виртуальная машина моделирует аспекты представления, которые не зависят от модели.

+0

Не могли бы вы показать, как бы вы связывались с ними? Потому что я пробовал, и я не мог заставить его работать. Как сохранить данные через мою модель? – Starwop

+0

Нет специальной привязки, ваш XAML отлично подходит. Вам просто нужно реализовать INotifyPropertyChanged в классе Child. –

+0

Несмотря на то, что в настоящее время у вас есть каждое нажатие клавиши, инициирующее обновление базы данных ... –

Смежные вопросы