📜  验证预览输入数字 wpf - C# (1)

📅  最后修改于: 2023-12-03 14:58:50.915000             🧑  作者: Mango

验证预览输入数字 wpf - C#

简介

本文介绍如何在 WPF 应用程序中验证预览输入的数字,并提供一些代码示例来帮助您实现此功能。

实现方式
方法一:使用 InputBindings

WPF 中的 InputBindings 可以帮助我们在不使用事件处理程序的情况下处理用户输入。您可以将数字键与特定的 Command 绑定,然后处理该 Command 的执行。

首先,我们需要添加一个 TextBlock 控件,用于显示数字:

<TextBlock x:Name="NumberDisplay" Text="0" FontSize="24" Padding="10" />

然后,在 XAML 中添加 InputBinding:

<Window.InputBindings>
    <KeyBinding Key="Add" Command="{Binding IncreaseNumberCommand}" />
    <KeyBinding Key="Subtract" Command="{Binding DecreaseNumberCommand}" />
</Window.InputBindings>

我们将数字增加和减少分别绑定到了 IncreaseNumberCommand 和 DecreaseNumberCommand。

接下来,我们需要在视图模型中实现这两个 Command:

private int _number = 0;
public int Number
{
    get { return _number; }
    set { SetProperty(ref _number, value); }
}

public ICommand IncreaseNumberCommand { get; }
public ICommand DecreaseNumberCommand { get; }

public MainViewModel()
{
    IncreaseNumberCommand = new DelegateCommand(() => Number++);
    DecreaseNumberCommand = new DelegateCommand(() => Number--);
}

最后,在视图中使用绑定将 Number 属性和 TextBlock 控件绑定在一起:

<TextBlock x:Name="NumberDisplay" Text="{Binding Number}" FontSize="24" Padding="10" />
方法二:使用 PreviewTextInput 事件

另一种方法是使用 PreviewTextInput 事件来处理用户输入。在这种情况下,我们可以验证输入是否为数字并防止用户输入非数字字符。

首先,我们需要添加一个 TextBox 控件:

<TextBox x:Name="NumberInput" PreviewTextInput="NumberInput_OnPreviewTextInput" />

然后,在代码中实现 PreviewTextInput 事件处理程序以验证用户输入:

private void NumberInput_OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
    int number;
    if(int.TryParse(e.Text, out number))
    {
        // 允许数字输入
    }
    else
    {
        // 防止非数字输入
        e.Handled = true;
    }
}

这会防止用户输入非数字字符。

方法三:使用 IDataErrorInfo

最后一种方法是使用 IDataErrorInfo 接口来验证输入。这个方法可以让您处理更复杂的验证逻辑,并返回验证错误消息。

首先,我们需要在视图模型中实现 IDataErrorInfo 接口:

public class MainViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private int _number = 0;
    public int Number
    {
        get { return _number; }
        set { SetProperty(ref _number, value); }
    }

    public string this[string propertyName]
    {
        get
        {
            if(propertyName == nameof(Number))
            {
                if(Number < 0 || Number > 100)
                {
                    return "数字必须在 0 到 100 之间。";
                }
            }

            return null;
        }
    }

    public string Error { get; }
}

在这个视图模型中,我们实现了 IDataErrorInfo 接口,并使用属性验证确保输入数字在 0 和 100 之间。

然后,在视图中使用绑定将 Number 属性和 TextBox 控件绑定在一起:

<TextBox x:Name="NumberInput" Text="{Binding Number, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<TextBlock x:Name="NumberError" Text="{Binding Path=(Validation.Errors)[0].ErrorContent, ElementName=NumberInput}" Foreground="Red" />

在这个例子中,我们使用 ValidatesOnDataErrors=True 来启用数据验证,并使用 Validation.Errors 属性提供的错误消息将 NumberError TextBlock 控件绑定到 TextBox 控件。

这样,当用户输入数字时,它会受到属性验证器的保护,并且在用户输入不正确的数字时会显示错误消息。

结论

本文介绍了三种方法来验证用户输入数字,并提供了相应的代码示例供参考。您可以根据自己的需求选择其中一种方法来实现您的 WPF 应用程序。