我有一个带有模板列的数据网格,并且该模板是一个文本框。它绑定到构成itemssource的集合中对象的“Quantity”属性。数量是整数。当我向datagrid添加项目时,我将向项目的PropertyChanged事件添加一个事件处理程序:
EnteredPart.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(p_PropertyChanged);
当用户在文本框中输入一个整数时,这很好用... p_PropertyChanged处理程序触发,我可以根据需要禁用按钮并改变数量。当用户输入非整数时,处理程序不会被调用,我只是在文本框周围得到一个红色轮廓。因此,我不能在需要时禁用必要的按钮(它们应该被禁用,数量不合法。)有什么方法可以对此做些什么吗?
编辑:我尝试将Quantity属性更改为字符串,这导致在输入非整数值时调用属性更改处理程序。但是,然后我在文本框中添加了验证以检查这一点,如果Validate方法返回false,则属性更改处理程序再次停止被命中。有什么方法可以同时获得验证和属性更改通知吗?
编辑2:这是我在另一个地方遇到的这个问题的另一个例子。我有一个用于添加/编辑电话号码的表单。电话号码文本框如下所示:
<TextBox >
<TextBox.Text>
<Binding Path="Phone.Number">
<Binding.ValidationRules>
<local:PhoneValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
单击保存按钮后,我需要检查我的viewmodel是否有效,因为如果不是,我不想运行save命令。但是,似乎没有任何方法可以做到这一点,因为如果验证失败,那么Phone.Number属性具有空值,我无法检查是否应该运行save命令。我要么需要访问错误状态(我认为它可以通过Validation.GetErrors工作,但不能),或者访问文本框中的实际文本,这在viewmodel中是不可用的。
答案 0 :(得分:0)
仅仅为了记录,如果您使用MVVM架构,View部分中的验证有许多缺点。
您可以尝试在视图中检查模型的内容:因此,您可以通过在视图中调用模型来打破MVVM的体系结构。
使用IDataErrorInfo
将帮助您实现MVVM的主要目标(即明确区分这三个部分)。
只是一个例子:
我想在这里你只是执行一个非常小的验证(只是检查它是否是int)。
但在不同的环境中,假设您的模型更复杂,需要更深入的验证。使用IDataErrorInfo
将帮助您深入检查模型,而无需从视图中调用它。
事实上,根据我的个人经验,由于我经常处理大型且高度相关的数据集,我甚至无法在没有IDataErrorInfo
的情况下使用验证进行图片处理,因为在调查所有数据时花费太多费用发现潜在的错误