【问题标题】:PRISM + TabControl + Validation = PainPRISM + TabControl + 验证 = 痛苦
【发布时间】:2016-01-25 10:50:48
【问题描述】:

在我的应用程序中,我有带有多个选项卡的对话框。我使用PrismTabControl 注册视图。

我想要的是验证整个对话框以禁用/启用保存按钮。

问题:目前我们有一个视图触发的验证。表示每个绑定项都实现了IDataErrorInfo 接口。当 View 显示时,绑定会触发界面并在 UI 上显示和错误。 ControlHasError 属性设置为 true,保存按钮被禁用。

但在显示视图之前不会触发验证。我应该将验证移至ViewModel 并自行验证Properties,还是有解决方案来验证TabControl 中的非活动 视图?

【问题讨论】:

    标签: c# validation prism tabcontrol idataerrorinfo


    【解决方案1】:

    没有足够的信息来回答你的问题,所以我只能猜测。首先,您必须了解 TabControl 中没有非活动视图。 TabControls 可视化树中一次只有一个视图,即选定的选项卡。这意味着其他视图将从可视化树中删除,直到它们被选中。不过这并不重要,因为验证是通过 ViewModel 控制的。您的 ViewModel 很可能有一个绑定到您的保存按钮的命令。这个命令应该有一个 CanExecute 定义返回 IDataErrorInfo.Error != null (意味着你没有错误)。您将在此处检查对象的有效性。如果有任何错误,则返回 false,否则返回 true。挂钩对象的属性更改事件,并调用 SaveCommand.RaiseCanExecuteChange 方法重新检查按钮的状态。

    如果每个视图一个选项卡都有它自己的 ViewModel,因此它有自己的保存命令,我建议使用 CompositeCommand。这确实是一个未知数,因为我不知道您是如何构建对话框、视图或 ViewModel 的。

    【讨论】:

    • 你好布赖恩,感谢你的回答。这里的问题是对象自己实现了 IDataErrorInfo。表示 ViewModel 目前不参与任何验证。问题是我无法正确跟踪验证状态。看来我需要将验证从对象移动到视图模型本身......
    • 不,你没有。您只需要挂钩到对象的 PropertyChange 事件并引发 RaiseCanExecuteChanged 方法。这将在您的 ViewModel 中引发该命令的 CanExecute。在这里,您可以根据对象的状态返回 true 或 false。
    • 没错,我会试试这个!是否有可能“突出显示”控件绑定到属性的选项卡导致验证错误而不显示它?我正在考虑获取所有绑定,然后查找导致验证错误的属性。
    • 是的,这应该是可能的。只需为 TabItemHeader 创建一个样式,它将根据您的绑定数据更改您想要的内容
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多