MVVM: я должен связать текстовые поля непосредственно с моделью, или я должен сначала создать полное свойство? - PullRequest
0 голосов
/ 04 января 2019

Итак, у меня есть такое текстовое поле:

<TextBox x:Name="FirstName" Width="100" />

, и у меня есть такая модель:

public class Person
{
    public string FirstName { get; set; }
}

Должна ли моя модель вида выглядеть так:

private Person _person;

public string FirstName
{
    get => _person.FirstName;
    set => _person.FirstName = value;
}

или

private string _firstName;
public string FirstName
{
    get { return _firstName; }
    set
    {
         _firstName = value;
         NotifyOfPropertyChange(FirstName);
    }
}

, а затем просто создать объект person позже?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Существует по крайней мере одна веская причина, по которой вам не следует связывать свойство модели представления с вашей моделью.Свойство модели представления связано с тем, что пользователь хочет ввести, что может быть или не быть допустимым вводом, если речь идет о вашей модели.Если вы эффективно используете модель так, как вы это делаете, вам нужно будет убедиться, что ваша модель может быть переведена в потенциально недопустимое состояние.Это то, что я не хотел бы делать.Модель представления существует для получения ввода от пользователя.Хотя вы можете быть в состоянии убедиться, что состояние модели представления всегда является действительным, указав допустимое состояние для элемента управления вводом (например, имя не должно превышать 100 символов в этом случае), возможно, имеется неверный ввод, который вы не можете остановить, когда пользователь вводитисключая ввод в элементе управления вводом.Эти состояния затем должны обрабатываться самой моделью представления.

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

0 голосов
/ 04 января 2019

Сделайте так, тогда вам не нужно заботиться о создании Person объекта.

private Person _person;
public string FirstName
{
    get => _person.FirstName;
    set
    {
        _person.FirstName = value;
        NotifyOfPropertyChange(nameof(FirstName));
    }
}
...