我很难理解如何使用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文本的原因是什么?
答案 0 :(得分:0)
属性更改通知不会像这样沿链条传播。更改地址后,只会通知实际在监视地址的内容,而不是正在监视其父QueriedPerson的内容。要解决此问题,请从网格中删除绑定,然后在TextBox绑定中指定完整路径:
<Grid>
...
<TextBox Text="{Binding QueriedPerson.StreetNumber, Mode=OneWay}" />
</Grid>
如果您绝对需要该Grid绑定,则可以将其放回去,但是您必须在TextBox中添加一个RelativeBinding,而该TextBox绑定到Grid的父级的DataContext(即QueryPersonViewModel)。