Связывание вложенных свойств с MVVM Light - PullRequest
0 голосов
/ 27 ноября 2018

Мне трудно понять, как связать вложенные свойства экспонированной модели в модели представления с помощью MVVM Light.

У меня настроено следующее, и компонент 'StreetAddress' не обновляется, когда службаобновляет адрес:

Модель адреса:

public class Address : ObservableObject
{
    private uint _streetNumber;

    public uint StreetNumber
    {
        get
        {
            return _streetNumber;
        }
        set
        {
            Set(ref _address, value, nameof(StreetNumber));
        }
    }
}

Модель человека:

public class Person : ObservableObject
{
    private Address _address;

    public Address Address
    {
        get
        {
            return _address;
        }
        set
        {
            Set(ref _address, value, nameof(Address));
        }
    }
}

Модель представления QueryPerson:

public class QueryPersonViewModel : ViewModelBase
{
    public Person QueriedPerson { get; set; }

    public Address QueriedPersonAddress
    {
        get
        {
            return QueriedPerson.Address
        }
    }
    ...
}

Фрагмент представления QueryPerson:

<Grid DataContext="{Binding QueriedPersonAddress}">
    ...
    <TextBox Text="{Binding StreetNumber, Mode=OneWay}" />
</Grid>

Придерживается ли приведенный выше шаблон передовой практики MVVM?Есть ли лучший способ привязки к вложенным свойствам из представления?По какой причине текст TextBox не будет обновляться, если вызывается установщик адресов?

1 Ответ

0 голосов
/ 28 ноября 2018

Уведомление об изменении свойства не распространяется таким образом вверх по цепочке.При изменении адреса будут уведомляться только те, кто фактически просматривает адрес, а не то, что смотрит его родительский QueriedPerson.Чтобы исправить это, удалите привязку из вашей Grid и укажите полный путь в привязке TextBox:

<Grid>
    ...
    <TextBox Text="{Binding QueriedPerson.StreetNumber, Mode=OneWay}" />
</Grid>

Если вам абсолютно необходима эта привязка Grid, вы можете вернуть ее обратно, но вам придется добавитьRelativeBinding к TextBox, который вместо этого привязывается к DataContext родительского элемента Grid (то есть QueryPersonViewModel).

...