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

Avalonia中[ObservableProperty]的OnPropertyChanged未触发问题咨询

问题排查与解决方案

首先,这不是Avalonia框架的问题,问题出在你的ViewModel实现方式上,具体原因和修复方法如下:

核心问题分析

  1. 重复实现接口逻辑:你提供的两段ViewModel代码存在概念混淆——MVVM Toolkit的ObservableObject已经完整实现了INotifyPropertyChanged接口及事件触发逻辑,不需要你再手动定义PropertyChanged事件或额外的OnPropertyChanged方法。
  2. 自定义方法不被框架调用:你自己编写的public void OnPropertyChanged([CallerMemberName] string name = "")不属于框架预期的方法,MVVM Toolkit生成的属性代码只会调用ObservableObject自带的protected virtual OnPropertyChanged方法,不会触发你自定义的这个版本。
  3. [ObservableProperty]的默认行为:使用该特性时,框架自动生成的属性代码会在值变更时,自动调用ObservableObject的OnPropertyChanged方法触发事件,不需要你手动在OnTestTextBoxChanged里写触发逻辑。

正确的ViewModel实现

删除所有冗余的自定义接口实现和方法,只保留继承ObservableObject和特性标记的字段即可:

using CommunityToolkit.Mvvm.ComponentModel;

public partial class MainViewModel : ObservableObject 
{ 
    [ObservableProperty]
    private string _testTextBox;
}

额外说明

  • 若需在属性变更时执行自定义逻辑,可以保留partial void OnTestTextBoxChanged(string oldValue, string newValue)方法(注意参数是新旧值成对出现),框架会自动在属性变更后调用此方法,无需手动触发事件:
    partial void OnTestTextBoxChanged(string oldValue, string newValue)
    {
        // 在此添加自定义逻辑,比如日志、数据校验等
    }
    
  • View中的绑定代码可显式声明双向绑定(Avalonia中TextBox的Text绑定默认是双向,显式声明更清晰):
    <TextBox Width="200" Height="200" Margin="50" Background="Beige" Text="{Binding TestTextBox, Mode=TwoWay}"/>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:32:03