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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:35