将WPF验证集成到MVVM中
|
我有一些ValidationRules可以正常工作。我只是想知道将其与ViewModel集成的最佳方法是什么。
我有一个(过于简单的)方法(HasAnyErrors),该方法遍历控制树以检查错误,但是我不确定如何将这些结果公开给ViewModel。换句话说,如果我的ICommand仅在没有验证错误的情况下可以执行,该怎么办?
我能想到的最好的办法就是处理按钮的click事件,然后在没有错误的情况下手动调用ViewModel的命令。
private void Button_Click_RunCommand(object sender, RoutedEventArgs e) {
if (this.HasAnyErrors())
return;
(this.DataContext as SomeViewModel).SomeCommand.Execute(null);
}
这不是最优雅的解决方案。但它似乎起作用。有没有更优雅的解决方案?
打破
为了完整起见,这里提供了验证方法(不久之后,大多数将是扩展方法)。它们(看起来)工作正常,但我敢肯定至少有人会怀疑它们的外观。
bool HasAnyErrors() {
List<string> errors = new List<string>();
GetErrors(this, errors);
return errors.Any();
}
void GetErrors(DependencyObject obj, List<string> errors) {
foreach (UIElement child in LogicalTreeHelper.GetChildren(obj).OfType<UIElement>()) {
if (child is TextBox)
AddErrorIfExists(child as UIElement, errors);
GetErrors(child, errors);
}
}
private void AddErrorIfExists(UIElement element, List<string> errors) {
if (Validation.GetHasError(element))
errors.Add(Validation.GetErrors(element)[0].ErrorContent.ToString());
}
没有找到相关结果
已邀请:
2 个回复
扭湘阀柿蹄
-如果要实现
,则可能会更简单。 如果是这种情况,您可以在按钮绑定到的命令的“ 4”方法中考虑视图模型的验证状态。
嘘崇蔡对