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

C# WPF MaterialDesign TextBox必填验证失效问题求助

问题描述

我是C# WPF和MaterialDesign的新手,用MaterialDesign制作了注册/登录页面,其中包含用户名输入框。想为该TextBox添加必填验证:输入框不为空时显示提示文本(helperText),为空时在下方显示错误信息。但目前的问题是,即使输入框中输入了内容,下方仍始终显示错误信息。

XML代码

<StackPanel Grid.Column="1"
            Grid.Row="4"
            Orientation="Horizontal"
            HorizontalAlignment="Center">
    <materialDesign:PackIcon Kind="Account"
                             Opacity="0.8"
                             Width="30"
                             Height="30"/>
    <TextBox  x:Name="UsernameTextBox"
              materialDesign:HintAssist.HelperText="Enter User Name."
              materialDesign:HintAssist.Hint="Username"
              Width="200"
              Margin="10 0 0 0">
        <TextBox.Text>
            <Binding Path="Username"
                  UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <Validation:NotEmptyValidationRule
                        ValidatesOnTargetUpdated="True"
                        xmlns:Validation="clr-namespace:LibraryManagementSystem.BusinessLogicLayer.Validation" />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
</StackPanel>

NotEmptyValidationRule的C#代码

private String userName;

public String Username
{
    get { return userName; }
    set { userName = value; }
}


public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    return string.IsNullOrWhiteSpace((value ?? "").ToString())
        ? new ValidationResult(false, "User Name is Required.")
        : ValidationResult.ValidResult;
}

相关截图说明

  • 项目文件夹结构:显示项目包含BusinessLogicLayer目录,NotEmptyValidationRule位于该目录下的Validation命名空间中
  • 设计界面:展示了带Account图标和Username输入框的登录/注册界面布局
  • 错误截图:输入框中已填写内容,但下方仍显示"User Name is Required."的错误提示

修复方案

1. 拆分ViewModel与ValidationRule代码

你当前的代码错误地将ViewModel的Username属性和ValidationRule的逻辑混在了同一个类中,这两者必须是独立的类:

  • ValidationRule类:仅负责验证逻辑
using System.Globalization;
using System.Windows.Controls;

namespace LibraryManagementSystem.BusinessLogicLayer.Validation
{
    public class NotEmptyValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            return string.IsNullOrWhiteSpace((value ?? "").ToString())
                ? new ValidationResult(false, "User Name is Required.")
                : ValidationResult.ValidResult;
        }
    }
}
  • ViewModel类:作为界面绑定的数据源,需实现INotifyPropertyChanged接口以触发属性变更通知
using System.ComponentModel;

public class AuthViewModel : INotifyPropertyChanged
{
    private string userName;

    public string Username
    {
        get { return userName; }
        set 
        { 
            userName = value;
            OnPropertyChanged(nameof(Username));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. 正确设置界面DataContext

确保你的Window/UserControl已绑定到ViewModel实例,比如在后台代码中:

public YourLoginWindow()
{
    InitializeComponent();
    DataContext = new AuthViewModel();
}

或在XAML根元素中设置:

<Window.DataContext>
    <local:AuthViewModel />
</Window.DataContext>

3. 验证逻辑生效说明

MaterialDesign的HelperText会优先显示验证错误信息,当验证通过(输入框不为空)时,会自动切换为你设置的Enter User Name.提示文本。完成上述修改后,输入内容时错误提示会自动消失。


内容的提问来源于stack exchange,提问作者Shen Sudara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:57:51