.NET MAUI使用AddINotifyPropertyChangedInterface双向绑定异常
.NET MAUI中PropertyChanged.Fody双向绑定失效的解决方案
问题根源
- 属性命名不符合.NET规范:原代码使用小写开头的
isSelected属性,虽绑定系统理论支持大小写匹配,但Fody在织入INotifyPropertyChanged实现时,对非PascalCase命名的属性可能存在隐性处理问题,导致控件向ViewModel的反向绑定失效。 - 未显式指定双向绑定模式:尽管CheckBox的
IsChecked和Switch的IsToggled默认绑定模式为TwoWay,但显式声明可避免框架对绑定模式的识别偏差。
解决步骤
1. 修正ViewModel属性命名
将ViewModel中的属性改为符合.NET规范的PascalCase命名,确保Fody能正确生成属性变更通知:
using PropertyChanged; using System.Windows.Input; namespace MauiApp4.MVVM.ViewModels { [AddINotifyPropertyChangedInterface] internal class MainViewModel { public ICommand Command => new Command(ToggleSelection); // 改为PascalCase命名规范 public bool IsSelected { get; set; } void ToggleSelection() { IsSelected = !IsSelected; } } }
2. 更新XAML绑定配置
同步修改XAML中的绑定路径,并显式指定Mode=TwoWay确保双向绑定生效:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MauiApp4.MainPage"> <ScrollView> <VerticalStackLayout Spacing="25" Padding="30,0" VerticalOptions="Center"> <Label Text="{Binding IsSelected}"/> <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}"/> <Switch IsToggled="{Binding IsSelected, Mode=TwoWay}"/> <Button Text="Change" Command="{Binding Command}"/> </VerticalStackLayout> </ScrollView> </ContentPage>
3. 验证Fody配置
确保项目已正确安装PropertyChanged.Fody NuGet包,且项目根目录存在FodyWeavers.xml文件(无则新建),内容如下:
<?xml version="1.0" encoding="utf-8"?> <Weavers> <PropertyChanged/> </Weavers>
验证效果
重新编译运行后:
- 手动操作CheckBox/Switch时,ViewModel的
IsSelected属性会同步更新,Label文本随之变化; - 点击按钮触发Command更新属性时,控件正常响应,且双向绑定功能在手动操作后不会失效。
内容的提问来源于stack exchange,提问作者Vijith Amar TK
相关产品推荐
相关产品推荐

