当我的ItemsSource绑定到复杂类型的ObserableCollection时,我试图了解验证如何适用于组合框。我使用RIA作为连接客户端层到中间层的服务。也不确定这是否会对组合框控件在数据形式中产生影响。我已经对此做了很多阅读,发现这篇文章最有用:http://www.run80.net/?p=93
首先,我的实体:我有一个像这样装饰的领域:
[Required]
public virtual long FrequencyId { get; set; }
[Include]
[Association("TreatmentFrequencyToTreatmentRecordAssociation", "FrequencyId", "Id", IsForeignKey = true)]
public virtual TreatmentFrequency Frequency
{
get
{
return this.frequency;
}
set
{
this.frequency = value;
if (value != null)
{
this.FrequencyId = value.Id;
}
}
}
现在我相信我不能在关联上设置[Required]注释,而是在外键id上设置(上面的文章说的内容)。
实际治疗频率类如下所示:
public class TreatmentFrequency
{
[Key]
public virtual long Id { get; set; }
[Required]
[StringLength(10)]
public virtual string Code { get; set; }
[Required]
[StringLength(40)]
public virtual string Name { get; set; }
public override bool Equals(object obj)
{
obj = obj as TreatmentFrequency;
if (obj == null)
{
return false;
}
return this.Id == ((TreatmentFrequency)obj).Id;
}
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
}
我已经覆盖了Equals和GetHashCode方法,因为在另一篇文章中它说,当你在一个集合中时,你需要覆盖equals以匹配键,否则当你使用SelectedItem时,尽管所有的值都是相同的集合和selecteditem它们将是两个不同的实例,因此与Equals的默认实现不匹配。
现在我的xaml看起来像这样:
<df:DataField Label="Frequency">
<ComboBox SelectedItem="{Binding Path=CurrentItem.Frequency, Mode=TwoWay}" ItemsSource="{Binding Path=Frequencies}" DisplayMemberPath="Name" SelectedValue="{Binding Path=CurrentItem.FrequencyId, Mode=TwoWay}" SelectedValuePath="Id"/>
</df:DataField>
老实说,上面对我没有多大意义,我可以删除SelectedValue和SelectedValuePath,表单仍然可以正常工作(没有验证)我认为Selected Value会指向复杂类型E.g. CurrentItem.Frequency然后是SelectedValuePath将是底层的“Name”属性。但是我也理解作者试图做的是[Required]标签不在关联上,而是外键id E.g. CurrentItem.FrequencyId,所以它必须要去某个地方。
现在最后的竞争对手是这个表单是向导的一部分,因此我无法验证整个对象,而是我手动必须验证某些字段,这些字段仅在此特定向导步骤中填充。为此,我创建了方法:
public void ValidateProperty(object value, string propertyName)
{
var results = new List<ValidationResult>();
Validator.TryValidateProperty(value, new ValidationContext(this.TreatmentRecord, null, null) { MemberName = propertyName }, results);
foreach (var error in results)
{
this.TreatmentRecord.ValidationErrors.Add(error);
}
}
在我的视图模型中,我有一个方法IsValid,在允许向导导航到下一步之前调用它,然后我调用上面的方法:
public bool IsValid
{
get
{
this.treatmentRecordWizardContext.ValidateProperty(this.treatmentRecordWizardContext.TreatmentRecord.Frequency, "Frequency");
this.treatmentRecordWizardContext.ValidateProperty(this.treatmentRecordWizardContext.TreatmentRecord.FrequencyId, "FrequencyId");
this.OnPropertyChanged(() => this.CurrentItem);
if (this.treatmentRecordWizardContext.TreatmentRecord.ValidationErrors.Count == 0)
{
return true;
}
return false;
}
}
使用上述所有代码时,当组合框保持为空时,将完全忽略验证。我还没有模仿组合框本身,所以我真的不知道为什么它不起作用,并且解决方案的哪个部分真的有问题,是绑定还是RIA中的实体没有正确定义!
希望有人可以帮助我花了很长时间试图让它工作,我认为这必须由其他开发人员进行,所以我希望这是一个简单的修复。
答案 0 :(得分:0)
这实际上是一个简单的问题,我假设[Required]注释会检查关联是否存在而不是null。似乎所有它实际上都检查在这种情况下FrequencyId不为null。还有一个问题是我使用的是长而不是可以长的(长?)。一旦我进行了更改以使它们可以为空,验证就开始按预期工作,即使对我来说没有任何意义的绑定也是如此。如果有人能解释他们会很棒!
菲尔