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

WinUI3 MVVM应用中如何本地化数据注解验证错误消息?

WinUI3 + MVVM Toolkit 验证错误消息本地化方案

问题背景

使用MVVM Toolkit的ObservableProperty和ObservableValidator构建WinUI3应用,通过[Required]、[MinLength]等Data Annotations做属性验证,希望通过.resw资源文件本地化验证错误消息,实现应用语言切换时自动更新对应语言的提示。ViewModel简化示例:

public partial class MyViewModel: ObservableValidator
{
    [ObservableProperty]
    [Required(ErrorMessage = "First name is required!")]
    [MinLength(3, ErrorMessage = "First name should be minimum 3 characters!")]
    [MaxLength(100, ErrorMessage = "First name should be maximum 100 characters!")]
    public partial string? FirstName { get; set; }
}

具体问题:

  1. 如何在WinUI3中将.resw本地化与ErrorMessage结合,或有无替代方案?
  2. ErrorMessageResourceType和ErrorMessageResourceName能否在WinUI3中配合.resw文件使用?
  3. 使用MVVM Toolkit的WinUI3应用处理验证本地化的最佳实践是什么?

环境信息:WinUI3(.NET 9)、MVVM Toolkit、.resw资源文件、RTL排版方向、手动调用ValidateAllProperties()验证


解决方案

1. .resw与ErrorMessage的结合方式

.resw资源文件可通过强类型资源类或ResourceLoader与Data Annotations结合,步骤如下:

  • 添加.resw资源文件:在项目中创建Resources.resw,并为目标语言添加对应子目录(如ar/Resources.resw用于阿拉伯语),在资源文件中定义验证消息键值对:
    • FirstName_Required: 对应语言的"名字必填"提示
    • FirstName_MinLength: 对应语言的"名字至少3个字符"提示
    • FirstName_MaxLength: 对应语言的"名字最多100个字符"提示
  • 生成强类型资源类:右键.resw文件→属性→自定义工具,设置为ReswFileCodeGenerator,自动生成Resources类,可直接在代码中引用资源键。

2. ErrorMessageResourceType与ErrorMessageResourceName的可用性

完全可以在WinUI3中配合.resw使用,只需指定生成的强类型资源类和资源键即可。修改后的ViewModel示例:

public partial class MyViewModel: ObservableValidator
{
    [ObservableProperty]
    [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "FirstName_Required")]
    [MinLength(3, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "FirstName_MinLength")]
    [MaxLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "FirstName_MaxLength")]
    public partial string? FirstName { get; set; }
}

注意:语言切换后需手动调用ValidateAllProperties()重新验证,因为Data Annotations在验证时才读取资源,确保错误消息更新。

3. 最佳实践总结

  • 优先使用强类型资源:通过ReswFileCodeGenerator生成强类型资源类,避免硬编码资源键,减少出错概率。
  • 语言切换后触发重验证:切换语言完成后,调用ViewModel的ValidateAllProperties(),结合ObservableValidator的通知机制,让UI自动更新错误提示。
  • RTL排版自动适配:无需在资源文件中额外处理RTL,WinUI3会根据当前语言的FlowDirection自动调整文本方向,只需保证资源内容是正确的RTL语言文本。
  • 自定义验证属性(灵活场景):若需动态参数替换(如MinLength的数值),可自定义验证属性,在FormatErrorMessage中用ResourceLoader读取资源并替换参数:
    public class LocalizedMinLengthAttribute : MinLengthAttribute
    {
        private readonly string _resourceKey;
    
        public LocalizedMinLengthAttribute(int length, string resourceKey) : base(length)
        {
            _resourceKey = resourceKey;
        }
    
        public override string FormatErrorMessage(string name)
        {
            var loader = ResourceLoader.GetForCurrentView();
            var message = loader.GetString(_resourceKey);
            return string.Format(message, Length);
        }
    }
    
    ViewModel中使用:
    [ObservableProperty]
    [LocalizedMinLength(3, "FirstName_MinLength")]
    public partial string? FirstName { get; set; }
    
  • UI绑定错误消息:在XAML中通过Validation.ErrorTemplate或直接绑定(Validation.Errors)[0].ErrorContent显示错误,确保UI响应验证变化:
    <TextBox Text="{x:Bind ViewModel.FirstName, Mode=TwoWay, ValidatesOnNotifyDataErrors=True}">
        <Validation.ErrorTemplate>
            <ControlTemplate>
                <StackPanel>
                    <ContentPresenter Content="{TemplateBinding Content}"/>
                    <TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent}" Foreground="Red"/>
                </StackPanel>
            </ControlTemplate>
        </Validation.ErrorTemplate>
    </TextBox>
    

内容的提问来源于stack exchange,提问作者Abdul Saboor Habibi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:05:18