.NET Maui中使用EventToCommandBehavior的问题:Name属性未更新
问题根源与解决方案
你的问题核心是Entry的输入内容没有同步到ViewModel的Name属性——你只触发了TextChanged对应的命令,但没有建立Entry.Text和Name属性的绑定关系,所以Name始终保持初始的空字符串,长度自然为0。
修复步骤:
1. 给Entry添加双向绑定(最推荐的方式)
修改XAML,把Entry的Text属性和ViewModel的Name做双向绑定,输入内容会自动同步到Name:
<Entry Placeholder="Enter Name" MaxLength="15" Text="{Binding Name, Mode=TwoWay}"> </Entry>
2. 优化ViewModel逻辑,利用ObservableProperty的回调
既然用了[ObservableProperty],可以直接使用自动生成的属性变更回调方法,替代单独的RelayCommand,代码更简洁:
[ObservableProperty] string _name = string.Empty; [ObservableProperty] bool _isNameLengthValid; // 当Name属性值变更时自动触发此方法 partial void OnNameChanged(string oldValue, string newValue) { IsNameLengthValid = newValue.Length >= 3; } [RelayCommand(CanExecute = nameof(IsNameLengthValid))] async Task Submit() { await Toast.Make("Form Submitted").Show().ConfigureAwait(false); }
如果你坚持用EventToCommandBehavior(不推荐)
如果一定要保留原有的行为绑定,需要在命令中接收TextChanged事件参数,手动获取输入文本并同步到Name:
// 修改RelayCommand,接收事件参数 [RelayCommand] private void NameChanged(TextChangedEventArgs args) { string currentText = args.NewTextValue ?? string.Empty; // 手动同步到Name属性 Name = currentText; IsNameLengthValid = currentText.Length >= 3; }
同时XAML中需要指定传递事件参数:
<Entry Placeholder="Enter Name" MaxLength="15"> <Entry.Behaviors> <toolkit:EventToCommandBehavior EventName="TextChanged" Command="{Binding NameChangedCommand}" PassEventArgument="True"/> </Entry.Behaviors> </Entry>
总结
最规范的做法是通过双向绑定同步输入内容,配合ObservableProperty的回调处理逻辑,这也是MVVM模式下的标准实现方式,避免手动处理事件参数的冗余代码。
内容的提问来源于stack exchange,提问作者JSmith
相关产品推荐
相关产品推荐

