关于验证Combobox是否有选中项!

zdqyundou 2010-05-07 02:57:27
页面上有一个ValidationSummary和两个Combobox,每个Combobox分别绑定了数据,都能正常显示。

<ComboBox Height="23" SelectedValue="{Binding Path=Supplier,Mode=TwoWay,ValidatesOnDataErrors=True, NotifyOnValidationError=True,ValidatesOnExceptions=True,ValidatesOnNotifyDataErrors=True}" SelectedValuePath="Supplier" HorizontalAlignment="Left" Margin="311,124,0,0" Name="comboBox_Supplier" VerticalAlignment="Top" Width="198"/>
<ComboBox Height="23" SelectedValue="{Binding Path=MotorcycleType,Mode=TwoWay,ValidatesOnDataErrors=True, NotifyOnValidationError=True,ValidatesOnExceptions=True}" SelectedValuePath="MotorcycleType" HorizontalAlignment="Left" Margin="311,159,0,0" Name="comboBox_CarType" VerticalAlignment="Top" Width="139" />

我设置了如上的验证方式,后台文件如下使用:

BindingExpression BE3 = this.comboBox_Supplier.GetBindingExpression(ComboBox.SelectedValueProperty);
BE3.UpdateSource();

BindingExpression BE4 = this.comboBox_CarType.GetBindingExpression(ComboBox.SelectedValueProperty);
BE4.UpdateSource();


但是运行的时候,我发现如果Combobox没有选择项,则ValidationSummary有提示,但是选中后ValidationSummary仍然显示格式不正确(数据模型里,字段要求必填,所以抛出了默认的异常:输入格式不正确)。

使用Combobox一般都是显示主表的记录供选择,实际取得的是主表的ID值,写入外键表的方式,不知道有人遇到过没?
...全文
535 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
websco 2010-05-07
  • 打赏
  • 举报
回复

<ComboBox Name="cbQTN" SelectedValue="{Binding QTN, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" SelectedValuePath="Value" DisplayMemberPath="Text" />


我的全是 string 类型,但是在 ComboBox 未被选择任何一项时,SelectedValue==null,
此时数据模型中对应的 QTN 属性的 setter 方法从未被调用,所以 [Required] 起不了作用。

如果楼主也是全是 string 类型,并且在默认情况下 ComboBox 没被选择任何一项时,应该和我的情况是相同的。
zdqyundou 2010-05-07
  • 打赏
  • 举报
回复
websco请贴出XAML前台的Combobox代码,我觉得ValidatesOnExceptions=True是这个在作怪,不加这个就没有异常,我判断的是ComboBox.SelectedValueProperty,很显然是字符串,但是表结构需要的是int类型。所以抛出了默认的异常。
websco 2010-05-07
  • 打赏
  • 举报
回复
和楼主的结论正好相反,我总是在没有选中项的时候出现不了提示,选中了后就一切正常。

估计楼主所说的在选中了项之后,Binding的DataItem对应的Property会不会真的是格式不正确?即在数据模型里,抛出了异常,但是不是[Required]所引起的异常,楼主可以在Debug选项中,不要选择“仅我的代码”,然后设置断点调试。
websco 2010-05-07
  • 打赏
  • 举报
回复
我在3楼中说错了,并不是 setter 方法从未被调用,而是 setter 的方法体为:

if ((object.ReferenceEquals(this.QTNField, value) != true))
{
this.ValidateProperty("QTN",value);
this.QTNField = value;
this.RaisePropertyChanged("QTN");
}
...
public void ValidateProperty(string memberName, object value)
{
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = memberName });
}

这样在 Binding 至 TextBox.TextProperty 时是可以的,但是 Binding 至 ComboBox 时,就得改为

if (value== null || (object.ReferenceEquals(this.QTNField, value) != true))
{
this.ValidateProperty("QTN",value);
this.QTNField = value;
this.RaisePropertyChanged("QTN");
}

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧