0

我有一个带有模板列的数据网格,该模板中有一个文本框。它绑定到构成 itemssource 的集合中对象的“数量”属性。数量是一个整数。当我将一个项目添加到数据网格时,我正在向该项目的 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>

单击保存按钮后,我需要检查我的视图模型是否有效,因为如果不是,我不想运行保存命令。但是,似乎没有任何方法可以做到这一点,因为如果验证失败,那么 Phone.Number 属性的值为 null,我无法检查是否应该运行 save 命令。我要么需要访问错误状态(我认为它可以通过 Validation.GetErrors 工作,但没有),要么需要访问文本框中的实际文本,这在视图模型中不可用。

4

1 回答 1

0

仅作记录,如果您处于 MVVM 架构中,则 View 部分中的验证有很多缺点。

您将尝试在视图中检查模型的内容:因此,您将通过在视图中调用模型来破坏 MVVM 的体系结构。

使用IDataErrorInfo将帮助您实现 MVVM 的主要目标(即明确区分三个部分)。

只是一个例子:

我认为您在这里只是执行了一个非常小的验证(只需检查它是否是 int )。但是在不同的环境中,假设您的模型要复杂得多,需要更深入的验证。UsingIDataErrorInfo将帮助您深入检查模型,而无需从视图中调用它。事实上,根据我的个人经验,由于我经常处理大型且高度相关的数据集,我什至无法想象没有使用验证的情况,IDataErrorInfo因为调查所有提供的数据并发现潜在错误会花费我太多成本

于 2011-06-16T13:54:28.703 回答