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

.NET MAUI中ViewModel子属性更新后UI不刷新问题求助

解决.NET MAUI中Player属性更新后界面不刷新的问题

问题核心

ViewModel里的Player1/Player2是通过ObservableProperty生成的,但Player类的Score属性没有触发属性变更通知。哪怕让Player继承了ObservableObject,如果Score的setter里没主动触发PropertyChanged事件,界面就无法感知到数值变化,自然不会刷新。

无需新建Player对象的解决方案

方案1:用ObservableProperty特性自动生成带通知的属性

直接让Player继承ObservableObject,并用[ObservableProperty]标记私有字段,会自动生成带属性变更通知的Score公共属性,省去手动写setter的麻烦。

修改后的Player类代码:

namespace SnookerScorer.DataModels
{
    public partial class Player : ObservableObject
    {
        [ObservableProperty]
        private int score = 0;

        public void UpdateScore(int num)
        {
            Score += num;
        }
    }
}

无论是直接给Score赋值,还是调用UpdateScore方法,都会自动触发PropertyChanged事件,界面会同步刷新。

方案2:手动在Score属性中触发变更通知

如果不想用特性,也可以手动在Score的setter里调用基类的OnPropertyChanged方法,同时注意修改UpdateScore方法的实现逻辑——要操作公共属性而非私有字段。

修改后的Player类代码:

namespace SnookerScorer.DataModels
{
    public partial class Player : ObservableObject
    {
        private int score;

        public int Score
        {
            get => score;
            set
            {
                if (score != value)
                {
                    score = value;
                    OnPropertyChanged(nameof(Score));
                }
            }
        }
       
        public Player() 
        {
            this.score = 0;
        }

        public void UpdateScore(int num)
        {
            Score += num; // 必须操作公共属性,才能触发setter里的通知
        }
    }
}

为什么之前继承ObservableObject没用?

你之前的Player类虽然继承了ObservableObject,但Score属性的setter里没有触发PropertyChanged事件——界面是靠监听这个事件来更新UI的,所以数值变了界面也没反应。

验证修改后,点击按钮更新Player1的Score时,界面上的Label会自动同步显示最新值,完全不需要新建Player对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:35:08