WPF 文本框中的必填字段验证

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/42750613/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 14:02:20  来源:igfitidea点击:

Required field Validation in WPF text box

c#wpfvalidationtextbox

提问by kAsdh

I need a simple way to validate of text boxes (Required Field). It should check all mandatory field existence , when user press button.

我需要一种简单的方法来验证文本框(必填字段)。当用户按下按钮时,它应该检查所有必填字段是否存在。

I have tried this code :

我试过这个代码:

<Window.Resources>
    <ControlTemplate x:Key="validationTemplate">
        <DockPanel>
            <TextBlock Foreground="Red" FontSize="25" Text="*" DockPanel.Dock="Right" />
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <Button Content="Button" HorizontalAlignment="Left" Height="26" Margin="62,213,0,0" VerticalAlignment="Top" Width="121" Click="Button_Click_1"/>
    <TextBox x:Name="txtEmail1" Text="" Height="61" Margin="116,10,194,0" Validation.ErrorTemplate="{StaticResource validationTemplate}"/>
</Grid>

please anyone suggest a way to make validation in Text boxes in WPF. Thank you

请任何人建议一种在 WPF 中的文本框中进行验证的方法。谢谢

回答by mm8

You should bind the Textproperty of the TextBoxto a property of a view model and implement the IDataErrorInfointerface in the view model class.

您应该将 的Text属性绑定TextBox到视图模型的属性并IDataErrorInfo在视图模型类中实现接口。

Please refer to the following sample code.

请参考以下示例代码。

Code:

代码:

public partial class Window3 : Window
{
    Window3ViewModel viewModel = new Window3ViewModel();
    public Window3()
    {
        InitializeComponent();
        DataContext = viewModel;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        viewModel.Validate();
    }
}

public class Window3ViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();

    public void Validate()
    {
        bool isValid = !string.IsNullOrEmpty(_text);
        bool contains = _validationErrors.ContainsKey(nameof(Text));
        if (!isValid && !contains)
            _validationErrors.Add(nameof(Text), "Mandatory field!");
        else if (isValid && contains)
            _validationErrors.Remove(nameof(Text));

        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(nameof(Text)));
    }

    public bool HasErrors => _validationErrors.Count > 0;

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public IEnumerable GetErrors(string propertyName)
    {
        string message;
        if (_validationErrors.TryGetValue(propertyName, out message))
            return new List<string> { message };

        return null;
    }

    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            _text = value; 
        }
    }
}

XAML:

XAML:

<Window x:Class="WpfApp2.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="Window3" Height="300" Width="300">
    <Window.Resources>
        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" FontSize="25" Text="*" DockPanel.Dock="Right" />
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Height="26" Margin="62,213,0,0" VerticalAlignment="Top" Width="121" Click="Button_Click_1"/>
        <TextBox x:Name="txtEmail1" Text="{Binding Text}" Height="61" Margin="116,10,194,0" Validation.ErrorTemplate="{StaticResource validationTemplate}"/>
    </Grid>
</Window>

And please refer to the following blog post for more information about how data validation in WPF works.

有关 WPF 中数据验证如何工作的更多信息,请参阅以下博客文章。

Data validation in WPF:https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/

WPF中的数据验证:https : //blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/