【问题标题】:Binding nested properties with MVVM Light使用 MVVM Light 绑定嵌套属性
【发布时间】:2019-04-28 15:29:31
【问题描述】:

我很难理解如何使用 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 查看sn-p:

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

上述模式是否符合 MVVM 最佳实践?有没有更好的方法从视图绑定到嵌套属性?如果调用地址设置器,TextBox 文本不更新的原因是什么?

【问题讨论】:

    标签: c# mvvm mvvm-light


    【解决方案1】:

    属性更改通知不会像那样向上传播。当 Address 改变时,只会通知实际正在监视 Address 的东西,而不是正在监视它的父 QueriedPerson 的东西。要解决此问题,请从 Grid 中删除绑定并在 TextBox 绑定中指定完整路径:

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

    如果您绝对需要该 Grid 绑定,则可以将其放回原处,但您必须向 TextBox 添加一个 RelativeBinding,该 TextBox 改为绑定到 Grid 的父级 DataContext(即 QueryPersonViewModel)。

    【讨论】:

    • 是否建议公开顶层模型(Person)中的所有嵌套属性?此外,此答案的 XAML 中仍然没有绑定到 Address 对象,因此根据解释,当 Address 更新时,文本框不会更改其文本。
    猜你喜欢
    • 2019-01-18
    • 2016-04-26
    • 1970-01-01
    • 2015-08-06
    • 2023-03-15
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多