You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向绑定无法获取新值:Account属性更新异常排查

问题原因
  • Account类缺乏属性变更通知:ViewModel中的Account属性使用[ObservableProperty]仅能监听对象引用的变化,无法感知其内部属性的修改。而Account类的Site、Description等属性是普通的私有setter属性,未实现INotifyPropertyChanged接口,导致视图输入的新值无法同步到ViewModel,或者ViewModel无法检测到属性更新。
  • 绑定更新时机延迟:Entry控件的双向绑定默认在控件失去焦点时才更新数据源。如果点击按钮时Entry仍处于聚焦状态,新输入的值还未同步到ViewModel的Account实例中,导致获取旧值。
解决方法

1. 让Account类支持属性变更通知

借助CommunityToolkit.Mvvm的ObservableObject基类和[ObservableProperty]特性,自动实现属性变更通知:

using CommunityToolkit.Mvvm.ComponentModel;

public partial class Account : ObservableObject
{
    private Account(string site, string description, string username, string password)
    {
        Site = site;
        Description = description;
        Username = username;
        Password = password;
    }

    [JsonConstructor]
    private Account(int id, string site, string description, string username, string password)
    {
        Id = id;
        Site = site;
        Description = description;
        Username = username;
        Password = password;
    }

    public int Id { get; private set; }
    
    [ObservableProperty]
    private string site;

    [ObservableProperty]
    private string description;

    [ObservableProperty]
    private string username;

    [ObservableProperty]
    private string password;

    public static Account Create(string site, string description, string username, string password)
    {
        return new Account(site, description, username, password);
    }

    public void ChangePassword(string password)
    {
        Password = password;
    }

    public void ChangeAccountDetails(string site, string description, string username, string password)
    {
        Site = site;
        Description = description;
        Username = username;
        Password = password;
    }
}

说明:继承ObservableObject后,用[ObservableProperty]修饰私有字段,会自动生成带PropertyChanged事件触发逻辑的公共属性(如Site对应site字段),确保内部属性变化时能通知到绑定系统。

2. 调整绑定更新时机(可选)

修改XAML中Entry的绑定,设置UpdateSourceTrigger=PropertyChanged,让输入内容实时同步到数据源,避免焦点问题导致的延迟:

<StackLayout Orientation="Horizontal" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
    <Label Text="Site:" VerticalOptions="Center" WidthRequest="90"/>
    <Entry Text="{Binding Account.Site, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Placeholder="Site" VerticalOptions="CenterAndExpand" WidthRequest="180"/>
</StackLayout>

<StackLayout Orientation="Horizontal" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
    <Label Text="Description:" VerticalOptions="Center" WidthRequest="90"/>
    <Entry Text="{Binding Account.Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Placeholder="Description" VerticalOptions="CenterAndExpand" WidthRequest="180"/>
</StackLayout>

<StackLayout Orientation="Horizontal" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
    <Label Text="Username:" VerticalOptions="Center" WidthRequest="90"/>
    <Entry Text="{Binding Account.Username, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Placeholder="Username" VerticalOptions="CenterAndExpand" WidthRequest="180"/>
</StackLayout>

<StackLayout Orientation="Horizontal" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
    <Label Text="Password:" VerticalOptions="Center" WidthRequest="90"/>
    <Entry Text="{Binding Account.Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Placeholder="Password" IsPassword="True" WidthRequest="180"/>
</StackLayout>

3. 简化ViewModel的Update逻辑

由于双向绑定已同步新值到Account实例,无需再调用ChangeAccountDetails方法,直接传入Account即可:

private async Task UpdateAccount()
{
    try
    {
        await _apiService.Update(Account);
        await Application.Current.MainPage?.DisplayAlert("", "Account updated successfully", "OK");
    }
    catch (Exception ex)
    {
        HandleException("An error occurred while updating the account", ex);
    }
}

内容的提问来源于stack exchange,提问作者redrum1337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:37:03