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
相关产品推荐
相关产品推荐

