C# 基于WPF异常的验证,未触发初始状态

C# 基于WPF异常的验证,未触发初始状态,c#,.net,wpf,validation,mvvm,C#,.net,Wpf,Validation,Mvvm,(我知道那里有一些相似的副本,但没有一个能帮助我,请听我说) 当有东西试图设置无效值时,我的模型的设置程序会抛出适当的异常。当用户键入一个新值时,这对验证非常有效 但是,当我创建一个新的模型对象时,初始状态可能无效(描述中没有值,等等)。这当然不会验证,但如果没有尝试设置值,则不会引发异常,以便ExceptionValidationRule捕获 我的简单解决方案是: 捕获当前对象中的更改,触发current.Value=current.Value类型求值以使.set\u Value部分运行并重新

(我知道那里有一些相似的副本,但没有一个能帮助我,请听我说)

当有东西试图设置无效值时,我的模型的设置程序会抛出适当的异常。当用户键入一个新值时,这对验证非常有效

但是,当我创建一个新的模型对象时,初始状态可能无效(描述中没有值,等等)。这当然不会验证,但如果没有尝试设置值,则不会引发异常,以便
ExceptionValidationRule
捕获

我的简单解决方案是:

  • 捕获当前对象中的更改,触发
    current.Value=current.Value
    类型求值以使
    .set\u Value
    部分运行并重新验证(从而触发
    ExceptionValidationRule
    以更新状态。但是,这感觉肮脏且错误

  • 捕获对象中的更改,并通过属性验证和 以某种方式更新
    hasrerror
    Validation.Errors
    ,这将触发对象更新其视觉状态。这感觉更像是一种黑客行为,我不知道如何处理它

  • 现在最大的问题是,我可能会连接一些适用于这两种情况的东西。但是它们完全违反了我的MVVM结构,我不知道如何将这种验证直接应用到MVVM中

    • 我已经考虑过创建自己的绑定类型,没有骰子
    • 我已经考虑过创建一个装饰器来捕捉我的孩子,可能会有用:需要更多信息吗
    • 我已经研究了
      IDataError
      实现,这对我不起作用,因为它需要使用
      this[string]
      索引器,这将与我现有的模型对象的实现冲突

    所以我没有主意了,我向你们请教如何解决这个问题。

    如果您的模型可能处于无效状态,那么让它实现
    IDataErrorInfo
    似乎是最合适的解决方案。
    IDataErrorInfo
    的问题在于您的模型上已经有了一个索引器,可以字符串参数?您可以使用它与公共索引器分开实现
    IDataErrorInfo

    public class Model
        : IDataErrorInfo
    {
        public string this[string parameter]
        {
            get { /* Your current indexer */ }
        }
    
        string IDataErrorInfo.this[string columnName]
        {
            get { /* IDataErrorInfo indexer implementation */ }
        }
    
        /* ... */
    }
    

    如果您根本无法修改模型,那么您可能需要创建一个ViewModel类来包装模型并实现
    IDataErrorInfo

    我同意Quartermeister的观点,IDataErrorInfo接口可能是最佳选择。当您无法实现此[string]时indexer,那么您仍然可以使用显式成员实现接口

    string IDataErrorInfo.this[string memberName] 
    { 
        get { return ... } 
    }
    
    您可以查看BookLibrary示例应用程序,它显示了IDataErrorInfo接口如何与MVVM一起使用