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

如何在Xamarin Forms中取消Entry的内容更改?

在Xamarin.Forms中取消/撤销Entry控件的内容更改

嘿,这个需求挺常见的,我来给你梳理几种靠谱的实现方式,看你适配哪种场景:

1. 保存原始值,手动触发撤销(比如按钮点击)

这种适合用户主动想撤销输入的场景,思路就是在Entry获得焦点时记录当前的文本值,需要撤销时把Entry的Text重置回这个原始值。

XAML代码:

<Entry x:Name="MyEntry" Placeholder="输入内容..." Focused="MyEntry_Focused"/>
<Button Text="撤销" Clicked="UndoButton_Clicked"/>

后台代码(Code-behind):

private string _originalEntryText;

private void MyEntry_Focused(object sender, FocusEventArgs e)
{
    // 获得焦点时保存当前文本作为原始值
    _originalEntryText = ((Entry)sender).Text;
}

private void UndoButton_Clicked(object sender, EventArgs e)
{
    // 撤销时恢复原始值
    MyEntry.Text = _originalEntryText;
}

2. MVVM模式下的撤销逻辑

如果你的项目用了MVVM,那可以把撤销逻辑放到ViewModel里,更符合架构设计:

ViewModel示例:

public class MyViewModel : INotifyPropertyChanged
{
    private string _currentText;
    private string _originalText;

    public string CurrentText
    {
        get => _currentText;
        set
        {
            _currentText = value;
            OnPropertyChanged();
        }
    }

    public ICommand UndoCommand { get; }

    public MyViewModel()
    {
        UndoCommand = new Command(ExecuteUndo);
        // 初始化时保存原始值(也可以在获得焦点时触发保存)
        _originalText = CurrentText;
    }

    private void ExecuteUndo()
    {
        CurrentText = _originalText;
    }

    // 这里实现INotifyPropertyChanged的OnPropertyChanged方法
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

XAML绑定:

<Entry Text="{Binding CurrentText}" Focused="Entry_Focused"/>
<Button Text="撤销" Command="{Binding UndoCommand}"/>

补充:在获得焦点时更新原始值

如果需要每次获得焦点都更新原始值,可以在View的Code-behind里加:

private void Entry_Focused(object sender, FocusEventArgs e)
{
    if (BindingContext is MyViewModel vm)
    {
        vm.UpdateOriginalText(); // 建议在ViewModel里封装公共方法更新原始值,避免直接访问私有字段
    }
}

(记得在ViewModel里加对应的UpdateOriginalText方法:public void UpdateOriginalText() => _originalText = CurrentText;)

3. 输入验证不通过时自动撤销

如果是用户输入不符合规则(比如只能输入数字,却输了字母),需要自动恢复到之前的内容,可以在TextChanged事件里处理:

private string _lastValidText;
private bool _isUpdating;

private void MyEntry_TextChanged(object sender, TextChangedEventArgs e)
{
    if (_isUpdating) return; // 避免循环触发事件

    Entry entry = (Entry)sender;
    // 这里写你的验证逻辑,比如检查是否是数字
    if (!IsValidInput(entry.Text))
    {
        _isUpdating = true;
        entry.Text = _lastValidText; // 恢复到上一次的有效内容
        _isUpdating = false;
    }
    else
    {
        _lastValidText = entry.Text; // 更新有效内容记录
    }
}

// 示例验证方法:只能输入数字
private bool IsValidInput(string input)
{
    return string.IsNullOrEmpty(input) || int.TryParse(input, out _);
}

这个方法要注意加_isUpdating标记,因为修改Entry.Text会再次触发TextChanged事件,避免无限循环。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:34:38