【发布时间】:2014-07-16 12:15:30
【问题描述】:
我正在尝试在我的 mvvm 项目中构建验证,但发现了一些问题...
首先我尝试使用 CodeContract,所以我在域层的实体上有一个简单的合同:
public class Class1
{
public virtual int ID {get;set;}
private string _desc;
public virtual string Desc
{
get { return _desc; }
set {
Contract.Requires(String.IsNullOrEmpty(value) == false);
Contract.Requires(value.Length >2, "> 2 required ");
_desc = value;
}
}
public Class1(int id)
{this.Id = id;}
}
然后在我的 Caliburn.micro Boostrapper 中的 Configure 方法中添加
ConventionManager.ApplyValidation = (binding, viewModelType, property) =>
{ binding.ValidatesOnExceptions = true; };
我只是简单地说
<TextBox x:Name="Class1Description" ></TextBox>
让 ViewModel 公开一个名为 Class1Description 的字符串属性(我不公开原始 Class1 对象)
运行应用程序的问题是在我的属性的set方法上抛出异常并且焦点从表单切换到visualstudio,按F5焦点返回到表单并且desc字段是红色的。
如何避免焦点切换?
在互联网上搜索验证我发现 IDataErrorInfo 似乎是最好的方法,所以我尝试 DataAnnotation 并将 [MinLength(2)] 添加到我的属性并更改引导程序
ConventionManager.ApplyValidation = (binding, viewModelType, property) =>
{binding.ValidatesOnDataErrors = true; };
视图中的新文本框是
<TextBox x:Name="Class1Description" Text="{Binding Path=Class1Description,
ValidatesOnDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
现在我运行应用程序,在 Desc 文本框中编写一个单字符字符串,将焦点切换到其他文本框,什么也没有发生...
我错过了什么?
【问题讨论】:
-
在您的课程中,当您不发出通知时,视图模型如何知道属性是否发生了变化?其次,要验证什么属性?我认为深度绑定不需要使用 Class1Desc 吗?
-
是 caliburn.micro 告诉 viewmodel 视图中属性的变化(基于文本框名称)。要验证的属性是我的唯一一个视图模型(如我所写): Class1Description 。不明白你最后一个问题
标签: c# validation mvvm data-annotations caliburn.micro