使用MVVM Light绑定嵌套属性

时间:2018-11-26 22:59:18

标签: c# mvvm mvvm-light

我很难理解如何使用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 :(得分:0)

属性更改通知不会像这样沿链条传播。更改地址后,只会通知实际在监视地址的内容,而不是正在监视其父QueriedPerson的内容。要解决此问题,请从网格中删除绑定,然后在TextBox绑定中指定完整路径:

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

如果您绝对需要该Grid绑定,则可以将其放回去,但是您必须在TextBox中添加一个RelativeBinding,而该TextBox绑定到Grid的父级的DataContext(即QueryPersonViewModel)。