代码之家  ›  专栏  ›  技术社区  ›  Aren

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

  •  1
  • Aren  · 技术社区  · 15 年前

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

    但是,当我创建一个新的模型对象时,初始状态可能是无效的(在描述中没有值,等等…),这当然不会验证,但是如果没有尝试设置值的东西,将不会为 ExceptionValidationRule

    我的简单解决方案是:

    1. 捕捉当前对象中的更改,触发 Current.Value = Current.Value 类型评估导致 .set_Value 部分运行并重新验证(从而触发 然而,这感觉又脏又错

    2. 捕获对象中的更改,并通过属性验证和 HasError Validation.Errors 它会触发对象更新它的视觉状态。 这感觉更像是一个黑客而不是任何东西,我不知道如何去做

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

    所以我没有主意了,我要转向

    2 回复  |  直到 15 年前
        1
  •  2
  •   Quartermeister    15 年前

    如果您的模型可能处于无效状态,那么让它实现 IDataErrorInfo 伊达埃罗林佛 您的模型上已经有一个索引器,它接受一个字符串参数?你可以用 explicit interface implementation 实施 伊达埃罗林佛 与公共索引器分开:

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

    如果您根本无法修改模型,那么您可能需要创建一个ViewModel类来包装模型并实现它 伊达埃罗林佛

        2
  •  1
  •   jbe    15 年前

    我同意夸特迈斯特的观点 这个[字符串] 然后您仍然可以使用显式成员实现接口。

    string IDataErrorInfo.this[string memberName] 
    { 
        get { return ... } 
    }
    

    你可以看看 书库 应用程序示例 WPF Application Framework (WAF)

    推荐文章