Avalonia中[ObservableProperty]的OnPropertyChanged未触发问题咨询
问题排查与解决方案
首先,这不是Avalonia框架的问题,问题出在你的ViewModel实现方式上,具体原因和修复方法如下:
核心问题分析
- 重复实现接口逻辑:你提供的两段ViewModel代码存在概念混淆——MVVM Toolkit的
ObservableObject已经完整实现了INotifyPropertyChanged接口及事件触发逻辑,不需要你再手动定义PropertyChanged事件或额外的OnPropertyChanged方法。 - 自定义方法不被框架调用:你自己编写的
public void OnPropertyChanged([CallerMemberName] string name = "")不属于框架预期的方法,MVVM Toolkit生成的属性代码只会调用ObservableObject自带的protected virtual OnPropertyChanged方法,不会触发你自定义的这个版本。 - [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
相关产品推荐
相关产品推荐

