.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
相关产品推荐
相关产品推荐

