Windows 10(通用Windows App)数据验证
Windows 10 (Universal Windows App) data validation
我想弄清楚如何在 UWP 下进行数据验证,但据我所知,基本上还没有什么可以实现的。
因此,我尝试实现我的自定义验证逻辑。我现在遇到的问题是,我在一个 TextBlock
上显示错误信息,而不是直接在包含数据错误的特定 TextBox
下显示。
这就是我现在所做的:
public class Customer : ViewModel
{
private string _Name = default(string);
public string Name { get { return _Name; } set { SetProperty(ref _Name, value); OnPropertyChanged("IsValid"); } }
private string _Surname = default(string);
public string Surname { get { return _Surname; } set { SetProperty(ref _Surname, value); OnPropertyChanged("IsValid"); } }
private DateTime _DateOfBirth = default(DateTime);
public DateTime DateOfBirth { get { return _DateOfBirth; } set { SetProperty(ref _DateOfBirth, value); OnPropertyChanged("IsValid"); } }
public int ID { get; set; }
public bool IsValid
{
get
{
//restart error info
_ErrorInfo = default(string);
if (string.IsNullOrWhiteSpace(Name))
_ErrorInfo += "Name cannot be empty!" + Environment.NewLine;
if (string.IsNullOrWhiteSpace(Surname))
_ErrorInfo += "Surname cannot be empty!" + Environment.NewLine;
//raise property changed
OnPropertyChanged("ErrorInfo");
return !string.IsNullOrWhiteSpace(Name) &&
!string.IsNullOrWhiteSpace(Surname);
}
}
private string _ErrorInfo = default(string);
public string ErrorInfo { get { return _ErrorInfo; } set { SetProperty(ref _ErrorInfo, value); } }
}
问题:
如何调整我的代码,这样我就可以在每个文本框下分配标签并在那里显示验证错误,而不是让一个标签包含所有错误信息?我应该为此使用字典吗?如果是,我如何将它绑定到我的视图?
您可以在文本框内制作弹出按钮。
一旦文本框因输入错误而失去焦点,就会显示弹出窗口。
您可以在文本框的 top/bottom/side 上设置弹出按钮的位置。
祝你好运!
我很快就成为了 Prism 的粉丝,看到这个精彩的演示 User input validation with Prism and data annotations on the UWP。
它比我在这里输入的任何内容都要好。
Prism 的问题在于它使用了字符串索引器。但是 uwp 中的 Bind 不允许字符串索引......仅限整数!还缺少一些关键功能,例如实体视图模型之间以及它们与上下文之间的协调。
我做了一些研发,似乎以下是 uwp 中一个好的验证器的关键要素
- 使用字符串作为绑定目标,以避免丢弃转换异常
- 将转换错误与验证错误分开跟踪
- 用于验证视图模型的基础 class 和自动生成的派生 classes 指定 属性 名称
- 将多个视图模型绑定在一起的事件,以便 ui 的多个部分保持一致
- 与上下文相关的集中式错误计数和保存/恢复能力
有什么可以做到的吗?如果是,那我还没找到。
sjb
我想弄清楚如何在 UWP 下进行数据验证,但据我所知,基本上还没有什么可以实现的。
因此,我尝试实现我的自定义验证逻辑。我现在遇到的问题是,我在一个 TextBlock
上显示错误信息,而不是直接在包含数据错误的特定 TextBox
下显示。
这就是我现在所做的:
public class Customer : ViewModel
{
private string _Name = default(string);
public string Name { get { return _Name; } set { SetProperty(ref _Name, value); OnPropertyChanged("IsValid"); } }
private string _Surname = default(string);
public string Surname { get { return _Surname; } set { SetProperty(ref _Surname, value); OnPropertyChanged("IsValid"); } }
private DateTime _DateOfBirth = default(DateTime);
public DateTime DateOfBirth { get { return _DateOfBirth; } set { SetProperty(ref _DateOfBirth, value); OnPropertyChanged("IsValid"); } }
public int ID { get; set; }
public bool IsValid
{
get
{
//restart error info
_ErrorInfo = default(string);
if (string.IsNullOrWhiteSpace(Name))
_ErrorInfo += "Name cannot be empty!" + Environment.NewLine;
if (string.IsNullOrWhiteSpace(Surname))
_ErrorInfo += "Surname cannot be empty!" + Environment.NewLine;
//raise property changed
OnPropertyChanged("ErrorInfo");
return !string.IsNullOrWhiteSpace(Name) &&
!string.IsNullOrWhiteSpace(Surname);
}
}
private string _ErrorInfo = default(string);
public string ErrorInfo { get { return _ErrorInfo; } set { SetProperty(ref _ErrorInfo, value); } }
}
问题:
如何调整我的代码,这样我就可以在每个文本框下分配标签并在那里显示验证错误,而不是让一个标签包含所有错误信息?我应该为此使用字典吗?如果是,我如何将它绑定到我的视图?
您可以在文本框内制作弹出按钮。
一旦文本框因输入错误而失去焦点,就会显示弹出窗口。
您可以在文本框的 top/bottom/side 上设置弹出按钮的位置。
祝你好运!
我很快就成为了 Prism 的粉丝,看到这个精彩的演示 User input validation with Prism and data annotations on the UWP。
它比我在这里输入的任何内容都要好。
Prism 的问题在于它使用了字符串索引器。但是 uwp 中的 Bind 不允许字符串索引......仅限整数!还缺少一些关键功能,例如实体视图模型之间以及它们与上下文之间的协调。
我做了一些研发,似乎以下是 uwp 中一个好的验证器的关键要素 - 使用字符串作为绑定目标,以避免丢弃转换异常 - 将转换错误与验证错误分开跟踪 - 用于验证视图模型的基础 class 和自动生成的派生 classes 指定 属性 名称 - 将多个视图模型绑定在一起的事件,以便 ui 的多个部分保持一致 - 与上下文相关的集中式错误计数和保存/恢复能力
有什么可以做到的吗?如果是,那我还没找到。
sjb